编译器
0.8.19+commit.7dd6d404
文件 1 的 22:Address.sol
pragma solidity ^0.8.1;
library Address {
function isContract(address account) internal view returns (bool) {
return account.code.length > 0;
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
文件 2 的 22:Constants.sol
pragma solidity ^0.8.17;
address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E;
address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;
文件 3 的 22: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;
}
}
文件 4 的 22:DefaultOperatorFilterer.sol
pragma solidity ^0.8.13;
import {OperatorFilterer} from "./OperatorFilterer.sol";
import {CANONICAL_CORI_SUBSCRIPTION} from "./lib/Constants.sol";
abstract contract DefaultOperatorFilterer is OperatorFilterer {
constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {}
}
文件 5 的 22:ERC1155.sol
pragma solidity ^0.8.0;
import "./IERC1155.sol";
import "./IERC1155Receiver.sol";
import "./extensions/IERC1155MetadataURI.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/introspection/ERC165.sol";
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
using Address for address;
mapping(uint256 => mapping(address => uint256)) private _balances;
mapping(address => mapping(address => bool)) private _operatorApprovals;
string private _uri;
constructor(string memory uri_) {
_setURI(uri_);
}
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC1155).interfaceId ||
interfaceId == type(IERC1155MetadataURI).interfaceId ||
super.supportsInterface(interfaceId);
}
function uri(uint256) public view virtual override returns (string memory) {
return _uri;
}
function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
require(account != address(0), "ERC1155: address zero is not a valid owner");
return _balances[id][account];
}
function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
public
view
virtual
override
returns (uint256[] memory)
{
require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");
uint256[] memory batchBalances = new uint256[](accounts.length);
for (uint256 i = 0; i < accounts.length; ++i) {
batchBalances[i] = balanceOf(accounts[i], ids[i]);
}
return batchBalances;
}
function setApprovalForAll(address operator, bool approved) public virtual override {
_setApprovalForAll(_msgSender(), operator, approved);
}
function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {
return _operatorApprovals[account][operator];
}
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
) public virtual override {
require(
from == _msgSender() || isApprovedForAll(from, _msgSender()),
"ERC1155: caller is not token owner or approved"
);
_safeTransferFrom(from, to, id, amount, data);
}
function safeBatchTransferFrom(
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) public virtual override {
require(
from == _msgSender() || isApprovedForAll(from, _msgSender()),
"ERC1155: caller is not token owner or approved"
);
_safeBatchTransferFrom(from, to, ids, amounts, data);
}
function _safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
) internal virtual {
require(to != address(0), "ERC1155: transfer to the zero address");
address operator = _msgSender();
uint256[] memory ids = _asSingletonArray(id);
uint256[] memory amounts = _asSingletonArray(amount);
_beforeTokenTransfer(operator, from, to, ids, amounts, data);
uint256 fromBalance = _balances[id][from];
require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
unchecked {
_balances[id][from] = fromBalance - amount;
}
_balances[id][to] += amount;
emit TransferSingle(operator, from, to, id, amount);
_afterTokenTransfer(operator, from, to, ids, amounts, data);
_doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
}
function _safeBatchTransferFrom(
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {
require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
require(to != address(0), "ERC1155: transfer to the zero address");
address operator = _msgSender();
_beforeTokenTransfer(operator, from, to, ids, amounts, data);
for (uint256 i = 0; i < ids.length; ++i) {
uint256 id = ids[i];
uint256 amount = amounts[i];
uint256 fromBalance = _balances[id][from];
require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
unchecked {
_balances[id][from] = fromBalance - amount;
}
_balances[id][to] += amount;
}
emit TransferBatch(operator, from, to, ids, amounts);
_afterTokenTransfer(operator, from, to, ids, amounts, data);
_doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
}
function _setURI(string memory newuri) internal virtual {
_uri = newuri;
}
function _mint(
address to,
uint256 id,
uint256 amount,
bytes memory data
) internal virtual {
require(to != address(0), "ERC1155: mint to the zero address");
address operator = _msgSender();
uint256[] memory ids = _asSingletonArray(id);
uint256[] memory amounts = _asSingletonArray(amount);
_beforeTokenTransfer(operator, address(0), to, ids, amounts, data);
_balances[id][to] += amount;
emit TransferSingle(operator, address(0), to, id, amount);
_afterTokenTransfer(operator, address(0), to, ids, amounts, data);
_doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
}
function _mintBatch(
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {
require(to != address(0), "ERC1155: mint to the zero address");
require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
address operator = _msgSender();
_beforeTokenTransfer(operator, address(0), to, ids, amounts, data);
for (uint256 i = 0; i < ids.length; i++) {
_balances[ids[i]][to] += amounts[i];
}
emit TransferBatch(operator, address(0), to, ids, amounts);
_afterTokenTransfer(operator, address(0), to, ids, amounts, data);
_doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
}
function _burn(
address from,
uint256 id,
uint256 amount
) internal virtual {
require(from != address(0), "ERC1155: burn from the zero address");
address operator = _msgSender();
uint256[] memory ids = _asSingletonArray(id);
uint256[] memory amounts = _asSingletonArray(amount);
_beforeTokenTransfer(operator, from, address(0), ids, amounts, "");
uint256 fromBalance = _balances[id][from];
require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
unchecked {
_balances[id][from] = fromBalance - amount;
}
emit TransferSingle(operator, from, address(0), id, amount);
_afterTokenTransfer(operator, from, address(0), ids, amounts, "");
}
function _burnBatch(
address from,
uint256[] memory ids,
uint256[] memory amounts
) internal virtual {
require(from != address(0), "ERC1155: burn from the zero address");
require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
address operator = _msgSender();
_beforeTokenTransfer(operator, from, address(0), ids, amounts, "");
for (uint256 i = 0; i < ids.length; i++) {
uint256 id = ids[i];
uint256 amount = amounts[i];
uint256 fromBalance = _balances[id][from];
require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
unchecked {
_balances[id][from] = fromBalance - amount;
}
}
emit TransferBatch(operator, from, address(0), ids, amounts);
_afterTokenTransfer(operator, from, address(0), ids, amounts, "");
}
function _setApprovalForAll(
address owner,
address operator,
bool approved
) internal virtual {
require(owner != operator, "ERC1155: setting approval status for self");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
function _beforeTokenTransfer(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {}
function _afterTokenTransfer(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {}
function _doSafeTransferAcceptanceCheck(
address operator,
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
) private {
if (to.isContract()) {
try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
if (response != IERC1155Receiver.onERC1155Received.selector) {
revert("ERC1155: ERC1155Receiver rejected tokens");
}
} catch Error(string memory reason) {
revert(reason);
} catch {
revert("ERC1155: transfer to non-ERC1155Receiver implementer");
}
}
}
function _doSafeBatchTransferAcceptanceCheck(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) private {
if (to.isContract()) {
try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
bytes4 response
) {
if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
revert("ERC1155: ERC1155Receiver rejected tokens");
}
} catch Error(string memory reason) {
revert(reason);
} catch {
revert("ERC1155: transfer to non-ERC1155Receiver implementer");
}
}
}
function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
uint256[] memory array = new uint256[](1);
array[0] = element;
return array;
}
}
文件 6 的 22:ERC165.sol
pragma solidity ^0.8.0;
import "./IERC165.sol";
abstract contract ERC165 is IERC165 {
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
文件 7 的 22:EnsanEditions.sol
pragma solidity ^0.8.17;
import "./GsERC1155Merkle.sol";
import 'operator-filter-registry/src/DefaultOperatorFilterer.sol';
contract EnsanEditions is GsERC1155Merkle, DefaultOperatorFilterer {
constructor() GsERC1155Merkle("Ensan Editions", "EES", "https://oxqme47eeycnsnbntin5otag4dgrsqd3alyb4b4lgcbkme4wkeca.arweave.net/deDCc-QmBNk0LZob10wG4M0ZQHsC8B4HizCCphOWUQQ", msg.sender, 1000) DefaultOperatorFilterer() {}
function oMint(uint256 _token_id, address _receiver, uint256 _amount) external onlyOwner {
if(_receiver == address(0)) revert ZeroAddress();
ReturnData memory rd = getTokenData(_token_id);
if(rd.total_supply + _amount > rd.max_supply) revert MaxSupply();
_mint(_receiver, _token_id, _amount, "");
}
function mint(uint256 _token_id, uint256 _amount) external payable whenNotPaused whenPublicSaleIsActive(_token_id){
if(msg.value < super.elligible_mint(_token_id, _amount)) revert InsufficentFunds();
_mint(_msgSender(), _token_id, _amount, "");
}
function wlMint(uint256 token_id, uint256 wlIndex, uint256 amount, bytes32[] calldata proof) external payable whenNotPaused {
if(msg.value < super.elligible_claim(amount, token_id, wlIndex, proof)) revert InsufficentFunds();
_mint(_msgSender(), token_id, amount, "");
}
function safeTransferFrom(address from, address to, uint256 tokenId, uint256 amount, bytes memory data)
public
override
onlyAllowedOperator(from)
{
super.safeTransferFrom(from, to, tokenId, amount, data);
}
function safeBatchTransferFrom(
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) public virtual override onlyAllowedOperator(from)
{
super.safeBatchTransferFrom(from, to, ids, amounts, data);
}
}
文件 8 的 22:GsDynamicPrice.sol
pragma solidity ^0.8.15;
library GsDynamicPrice {
error InvalidRule();
struct PriceRule {
uint128 trigger;
uint128 priceInWei;
}
function extractPrice(PriceRule[] storage ordered_rules, uint value, uint defaultPrice, uint amount) internal view
returns (bool triggered, uint price){
uint length = ordered_rules.length;
if (length == 0) {
return (false, amount * defaultPrice);
}
bool value_found;
bool value_before_first_rule;
price = 0;
PriceRule storage rule = ordered_rules[0];
if (value < rule.trigger + 1) {
value_before_first_rule = value_found = true;
if (value + amount < rule.trigger + 1) {
return (false, amount * defaultPrice);
} else {
unchecked {
price += (rule.trigger - value) * defaultPrice;
}
}
}
uint32 value_index = 0;
for (uint32 i = 0; i < length; i++) {
rule = ordered_rules[i];
if (!value_found) {
if (i == length - 1 && rule.trigger <= value) {
return (true, amount * rule.priceInWei);
} else if (rule.trigger < value && i < length - 1 && ordered_rules[i + 1].trigger > value) {
value_found = true;
value_index = i;
} else if (rule.trigger < value && i < length - 1 && ordered_rules[i + 1].trigger < value) {
continue;
}
}
if (rule.trigger < value + amount &&
(i == length - 1 || (i < length - 1 && ordered_rules[i + 1].trigger + 1 > value + amount))) {
if (value_index == i && !value_before_first_rule) {
unchecked {
price += amount * rule.priceInWei;
}
} else {
unchecked {
price += (value + amount - rule.trigger) * rule.priceInWei;
}
}
return (true, price);
} else if (rule.trigger < value + amount && i < length - 1 && ordered_rules[i + 1].trigger < value + amount) {
if (value_index == i && !value_before_first_rule) {
unchecked {
price += (ordered_rules[i + 1].trigger - value) * rule.priceInWei;
}
} else {
unchecked {
price += (ordered_rules[i + 1].trigger - rule.trigger) * rule.priceInWei;
}
}
continue;
} else if (value + amount < rule.trigger) {
unchecked {
price += (value + amount - ordered_rules[i - 1].trigger) * ordered_rules[i - 1].priceInWei;
}
return (true, price);
}
}
}
function checkValidRulesList(PriceRule[] calldata ordered_rules) internal pure returns(bool) {
uint length = ordered_rules.length;
if (length == 0) {return false;}
uint trigger = 0;
for (uint i = 0; i < length; i++) {
if (trigger < ordered_rules[i].trigger && ordered_rules[i].priceInWei >= 0) { trigger = ordered_rules[i].trigger; }
else { return false; }
}
return true;
}
}
文件 9 的 22:GsERC1155.sol
pragma solidity ^0.8.17;
import '@openzeppelin/contracts/access/Ownable.sol';
import '@openzeppelin/contracts/token/ERC1155/ERC1155.sol';
import '@openzeppelin/contracts/security/Pausable.sol';
import '@openzeppelin/contracts/interfaces/IERC2981.sol';
import '@openzeppelin/contracts/utils/Strings.sol';
import "./libraries/GsDynamicPrice.sol";
error UnknownModifier();
error Unauthorized(address user);
error TokenNotFound();
error Unburnable();
error SaleClosed();
error ExistingToken();
error TokenLockedBySupply();
error IndexOutOfRange();
error ListFull();
error InvalidRoyaltyShare();
error TransferFailed();
error ContractMint();
error MaxSupply();
error MaxCount();
error ZeroAddress();
error NotTokenOwnerOrAuthorised();
error InsufficentFunds();
contract GsERC1155 is ERC1155, Ownable, Pausable, IERC2981 {
enum PriceCondition{SUPPLY, MINTS}
string public name;
string public symbol;
string public contractURI;
TokenData internal _default;
PriceCondition[2] public price_condition_priority;
struct ReturnData {
uint128 base_price;
uint16 royalty_share;
bool active;
bool burnable;
bool use_dynamic_price;
bool isPaused;
uint32 max_supply;
uint32 total_supply;
uint16 max_per_wallet;
address royalty_recipient;
string uri;
uint256 mints_count;
}
struct TokenData {
mapping(address => uint256) mints_count;
uint128 base_price;
uint16 royalty_share;
bool public_sale;
bool burnable;
uint32 max_supply;
uint32 total_supply;
uint16 max_per_wallet;
bool exist;
bool use_dynamic_price;
address royalty_recipient;
string uri;
}
mapping(address => bool) private _editors;
mapping(uint256 => TokenData) internal token_datas;
mapping(uint256 => GsDynamicPrice.PriceRule[][]) internal price_conditions;
constructor(string memory _name, string memory _symbol, string memory _contractURI, address _recipient, uint16 _royaltyShare) ERC1155("https://geeks.solutions") {
_default.base_price = 0.05 ether;
_default.royalty_share = _royaltyShare;
_default.public_sale = true;
_default.max_supply = 1000;
_default.max_per_wallet = 1;
_default.exist = true;
_default.royalty_recipient = _recipient;
name = _name;
symbol = _symbol;
contractURI = _contractURI;
price_condition_priority[0] = PriceCondition.SUPPLY;
price_condition_priority[1] = PriceCondition.MINTS;
}
function setContractURI(string memory _contractURI) external onlyOwner {
contractURI = _contractURI;
}
function setModifier(uint256 _token_id, uint32 _type, bool _value) external editors tokenExist(_token_id) {
if (_type == 1) {
token_datas[_token_id].public_sale = _value;
} else if (_type == 2) {
token_datas[_token_id].burnable = _value;
} else if (_type == 3) {
token_datas[_token_id].use_dynamic_price = _value;
} else {
revert UnknownModifier();
}
}
modifier whenPublicSaleIsActive(uint256 _token_id) {
if(!token_datas[_token_id].public_sale) revert SaleClosed();
_;
}
modifier tokenExist(uint256 tokenId) {
_tokenExist(tokenId);
_;
}
function _tokenExist(uint256 tokenId) internal view virtual {
if (!token_datas[tokenId].exist) revert TokenNotFound();
}
modifier editors() {
_checkEditors();
_;
}
function _checkEditors() internal view virtual {
if (!((owner() == _msgSender()) || _editors[_msgSender()])) revert Unauthorized(_msgSender());
}
function enableEditor(address editor) external onlyOwner {
_editors[editor] = true;
}
function disableEditor(address editor) external onlyOwner {
_editors[editor] = false;
}
function totalSupply(uint256 id) public view virtual returns (uint32) {
return token_datas[id].total_supply;
}
function pause() external onlyOwner {
_pause();
}
function unpause() external onlyOwner {
_unpause();
}
function uri(uint256 _token_id) public view override tokenExist(_token_id) returns (string memory) {
return token_datas[_token_id].uri;
}
function setURI(uint256 _token_id, string memory _tokenURI) external editors tokenExist(_token_id) {
token_datas[_token_id].uri = _tokenURI;
}
function getDefaultTokenData() external view returns(ReturnData memory) {
return ReturnData({
base_price: _default.base_price,
royalty_share: _default.royalty_share,
royalty_recipient: _default.royalty_recipient,
active: _default.public_sale,
burnable: _default.burnable,
max_supply: _default.max_supply,
total_supply: _default.total_supply,
max_per_wallet: _default.max_per_wallet,
use_dynamic_price: _default.use_dynamic_price,
uri: _default.uri,
mints_count: 0,
isPaused: super.paused()
});
}
function setDefaultRoyalties(address _recipient, uint16 _share) public onlyOwner {
_default.royalty_recipient = _recipient;
_default.royalty_share = _share;
}
function setDefaultModifiers(bool _publicSale, bool _burnable, bool _use_dynamic_price) public onlyOwner {
_default.public_sale = _publicSale;
_default.burnable = _burnable;
_default.use_dynamic_price = _use_dynamic_price;
}
function setDefaultTokenMeta(uint32 _maxSupply, uint8 _maxPerWallet, uint128 _price_in_wei) public onlyOwner {
_default.max_supply = _maxSupply;
_default.max_per_wallet = _maxPerWallet;
_default.base_price = _price_in_wei;
}
function setDefaults(address _recipient, uint16 _share,
bool _publicSale, bool _burnable, bool _use_dynamic_price,
uint32 _maxSupply, uint8 _maxMintsPerWallet, uint128 _price_in_wei) external onlyOwner {
setDefaultRoyalties(_recipient, _share);
setDefaultModifiers(_publicSale, _burnable, _use_dynamic_price);
setDefaultTokenMeta(_maxSupply, _maxMintsPerWallet, _price_in_wei);
}
function getTokenData(uint256 id) public view tokenExist(id)
returns(ReturnData memory) {
TokenData storage td = token_datas[id];
return ReturnData({
base_price: td.base_price,
royalty_share: td.royalty_share,
active: td.public_sale,
burnable: td.burnable,
max_supply: td.max_supply,
total_supply: td.total_supply,
max_per_wallet: td.max_per_wallet,
use_dynamic_price: td.use_dynamic_price,
royalty_recipient: td.royalty_recipient,
uri: td.uri,
isPaused: super.paused(),
mints_count: 0
}
);
}
function addNewToken(uint256 _tokenId,
string calldata _tokenUri,
bool _tokenPublicSale,
bool _tokenBurnable,
uint32 _tokenMaxSupply,
uint16 _tokenMaxMintsPerWallet,
uint128 price_in_wei,
uint16 _tokenRoyaltyShare,
address _tokenRoyaltyRecipient,
bool _use_dynamic_price) external editors {
addToken(_tokenId, _tokenUri, _tokenPublicSale, _tokenBurnable, _tokenMaxSupply,
_tokenMaxMintsPerWallet, price_in_wei, _tokenRoyaltyShare, _tokenRoyaltyRecipient, _use_dynamic_price);
}
function addNewTokenLight(uint256 _tokenId, string calldata _tokenUri) external editors {
addToken(_tokenId, _tokenUri, _default.public_sale, _default.burnable, _default.max_supply, _default.max_per_wallet,
_default.base_price, _default.royalty_share, _default.royalty_recipient, _default.use_dynamic_price);
}
function addToken(uint256 _tokenId,
string calldata _tokenUri,
bool _tokenPublicSale,
bool _tokenBurnable,
uint32 _tokenMaxSupply,
uint16 _tokenMaxPerWallet,
uint128 _tokenPrice,
uint16 _tokenRoyaltyShare,
address _tokenRoyaltyRecipient,
bool _use_dynamic_price) internal {
if(token_datas[_tokenId].total_supply > 0) revert ExistingToken();
TokenData storage td = token_datas[_tokenId];
td.base_price = _tokenPrice;
td.royalty_share = _tokenRoyaltyShare;
td.public_sale = _tokenPublicSale;
td.burnable = _tokenBurnable;
td.max_supply = _tokenMaxSupply;
td.max_per_wallet = _tokenMaxPerWallet;
td.exist = true;
td.royalty_recipient = _tokenRoyaltyRecipient;
td.uri = _tokenUri;
td.use_dynamic_price = _use_dynamic_price;
}
function editTokenMeta(uint256 _tokenId, uint32 _maxSupply, uint16 _maxPerWallet, uint128 _price_in_wei) external editors {
if(token_datas[_tokenId].total_supply > 0) revert TokenLockedBySupply();
token_datas[_tokenId].max_supply = _maxSupply;
token_datas[_tokenId].max_per_wallet = _maxPerWallet;
token_datas[_tokenId].base_price = _price_in_wei;
}
function getMintTotalPrice(address account, uint256 token_id, uint256 amount) external view tokenExist(token_id)
returns(uint256 price) {
TokenData storage td = token_datas[token_id];
if (td.use_dynamic_price) {
return extractTotalPrice(token_id, td.base_price, td.total_supply, td.mints_count[account], amount);
}
return td.base_price * amount;
}
function initFront(address account, uint256 token_id) public view virtual tokenExist(token_id)
returns(ReturnData memory) {
TokenData storage td = token_datas[token_id];
return ReturnData({
base_price: td.base_price,
royalty_share: td.royalty_share,
active: td.public_sale,
burnable: td.burnable,
max_supply: td.max_supply,
total_supply: td.total_supply,
max_per_wallet: td.max_per_wallet,
use_dynamic_price: td.use_dynamic_price,
royalty_recipient: td.royalty_recipient,
uri: td.uri,
isPaused: super.paused(),
mints_count: td.mints_count[account]
});
}
function getPriceRules(uint256 _token_id, uint8 _priority_index) external view
returns(PriceCondition, GsDynamicPrice.PriceRule[] memory){
if(_priority_index >= price_conditions[_token_id].length) revert IndexOutOfRange();
return (price_condition_priority[_priority_index], price_conditions[_token_id][_priority_index]);
}
function reversePriceConditionPriority() external onlyOwner {
PriceCondition[2] memory tmp = price_condition_priority;
price_condition_priority[0] = tmp[1];
price_condition_priority[1] = tmp[0];
}
function addPriceRules(uint256 _token_id, GsDynamicPrice.PriceRule[] calldata _ordered_rules) external editors tokenExist(_token_id) {
if(!GsDynamicPrice.checkValidRulesList(_ordered_rules)) revert GsDynamicPrice.InvalidRule();
uint256 new_index = price_conditions[_token_id].length;
if(new_index >= price_condition_priority.length) revert ListFull();
price_conditions[_token_id].push();
for(uint8 i = 0; i < _ordered_rules.length; i++) {
price_conditions[_token_id][new_index].push(_ordered_rules[i]);
}
}
function updatePriceRules(uint256 _token_id, uint8 _priority_index, GsDynamicPrice.PriceRule[] calldata _ordered_rules) external editors tokenExist(_token_id) {
if(_priority_index >= price_conditions[_token_id].length) revert IndexOutOfRange();
if(!GsDynamicPrice.checkValidRulesList(_ordered_rules)) revert GsDynamicPrice.InvalidRule();
delete price_conditions[_token_id][_priority_index];
for(uint8 i = 0; i < _ordered_rules.length; i++) {
price_conditions[_token_id][_priority_index].push(_ordered_rules[i]);
}
}
function royaltyInfo(uint256 _token_id, uint256 _salePrice) external view override returns (address receiver, uint256 royaltyAmount) {
return (token_datas[_token_id].royalty_recipient, (_salePrice * token_datas[_token_id].royalty_share) / 10000);
}
function setRoyalties(uint256 _token_id, address _newRecipient, uint8 _newShare) external onlyOwner tokenExist(_token_id) {
if(_newRecipient == address(0)) revert ZeroAddress();
if(_newShare > 9999) revert InvalidRoyaltyShare();
token_datas[_token_id].royalty_recipient = _newRecipient;
token_datas[_token_id].royalty_share = _newShare;
}
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155, IERC165) returns (bool) {
return (interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId));
}
function burn(address account, uint256 id, uint256 amount) public virtual whenNotPaused{
if (!token_datas[id].burnable) revert Unburnable();
if (!(account == _msgSender() || isApprovedForAll(account, _msgSender()))) revert NotTokenOwnerOrAuthorised();
_burn(account, id, amount);
}
function burnBatch(address account, uint256[] memory ids, uint256[] memory amounts) public virtual whenNotPaused{
for(uint i = 0; i < ids.length; i++) {
if(!token_datas[ids[i]].burnable) revert Unburnable();
}
if (!(account == _msgSender() || isApprovedForAll(account, _msgSender()))) revert NotTokenOwnerOrAuthorised();
_burnBatch(account, ids, amounts);
}
function withdraw() external onlyOwner {
uint256 balance = address(this).balance;
(bool succ,) = payable(msg.sender).call{
value: balance
}("");
if(!succ) revert TransferFailed();
}
function _beforeTokenTransfer(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal whenNotPaused virtual override(ERC1155) {
super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
if (from == address(0)) {
for (uint256 i = 0; i < ids.length; ++i) {
unchecked{
token_datas[ids[i]].mints_count[to] += amounts[i];
token_datas[ids[i]].total_supply += uint32(amounts[i]);
}
}
}
if (to == address(0)) {
for (uint256 i = 0; i < ids.length; ++i) {
uint256 id = ids[i];
uint32 amount = uint32(amounts[i]);
uint32 supply = token_datas[id].total_supply;
if(amount > supply) revert MaxSupply();
unchecked {
token_datas[id].total_supply = supply - amount;
}
}
}
}
function elligible_mint(uint256 id, uint256 amount) view internal
returns(uint256 dynamicPrice) {
TokenData storage td = token_datas[id];
return elligible_mint(td, id, amount, td.use_dynamic_price, td.max_per_wallet, td.base_price);
}
function elligible_mint(uint256 _token_id, uint256 _amount, bool _load_dynamic_price, uint _wallet_max, uint _default_price) view internal
returns(uint256 dynamicPrice) {
TokenData storage td = token_datas[_token_id];
return elligible_mint(td, _token_id, _amount, _load_dynamic_price, _wallet_max, _default_price);
}
function elligible_mint(TokenData storage td, uint256 _token_id, uint256 _amount, bool _load_dynamic_price, uint _wallet_max, uint _default_price) view private tokenExist(_token_id)
returns(uint256 dynamicPrice) {
uint32 _totalSupply = td.total_supply;
if(_totalSupply + _amount > td.max_supply) revert MaxSupply();
uint256 mintsCount = td.mints_count[_msgSender()];
if(mintsCount + _amount > _wallet_max) revert MaxCount();
if(tx.origin != _msgSender()) revert ContractMint();
if (_load_dynamic_price) {
return extractTotalPrice(_token_id, _default_price, _totalSupply, mintsCount, _amount);
} else {
return _default_price * _amount;
}
}
function extractTotalPrice(uint256 _token_id, uint256 _base_price, uint32 total_supply, uint256 mintsCount, uint256 amount) view internal
returns(uint256) {
uint256 value;
for(uint i = 0; i < price_conditions[_token_id].length; i++) {
if (price_condition_priority[i] == PriceCondition.SUPPLY) {
value = total_supply;
} else {
value = mintsCount;
}
(bool triggered, uint256 price) = GsDynamicPrice.extractPrice(price_conditions[_token_id][i], value, _base_price, amount);
if (triggered) return price;
}
return _base_price * amount;
}
}
文件 10 的 22:GsERC1155Merkle.sol
pragma solidity ^0.8.17;
import "./GsERC1155.sol";
import '@openzeppelin/contracts/utils/cryptography/MerkleProof.sol';
error WrongRoot();
error InactiveWhitelist();
error InvalidProof();
contract GsERC1155Merkle is GsERC1155 {
struct WhitelistData {
bytes32 merkle_root;
uint128 token_price;
uint8 max_per_wallet;
bool active;
bool use_dynamic_price;
}
mapping(uint256 => WhitelistData[]) internal whitelist_datas;
constructor(string memory _name, string memory _symbol, string memory _contractURI, address _recipient, uint16 _royaltyShare)
GsERC1155(_name, _symbol, _contractURI, _recipient, _royaltyShare){}
modifier whitelistExist(uint256 whitelistIndex, uint256 tokenId) {
_whiteListExist(whitelistIndex, tokenId);
_;
}
function _whiteListExist(uint256 whitelistIndex, uint256 tokenId) internal view virtual {
if(whitelistIndex >= whitelist_datas[tokenId].length) revert IndexOutOfRange();
}
function addNewWhitelist(uint256 _token_id, uint128 _wl_price_in_wei, bytes32 _merkle_root,
uint8 _wl_max_per_wallet, bool _active, bool _use_dynamic_price) external editors tokenExist(_token_id)
returns(uint256){
whitelist_datas[_token_id].push(
WhitelistData({
token_price: _wl_price_in_wei,
active: _active,
merkle_root: _merkle_root,
max_per_wallet: _wl_max_per_wallet,
use_dynamic_price: _use_dynamic_price
}));
return whitelist_datas[_token_id].length - 1;
}
function editWhitelistFull(uint256 _whitelist_index, uint256 _token_id, uint128 _wl_price_in_wei, bytes32 _merkle_root,
uint8 _wl_max_per_wallet, bool _active, bool _use_dynamic_price) external editors whitelistExist(_whitelist_index, _token_id) {
editWhitelist(whitelist_datas[_token_id][_whitelist_index], _token_id, _whitelist_index, _merkle_root, _active, _wl_price_in_wei, _wl_max_per_wallet, _use_dynamic_price);
}
function editWhitelistPartial(uint256 _whitelist_index, uint256 _token_id, bytes32 _merkle_root, bool _active, bool _use_dynamic_price) external editors whitelistExist(_whitelist_index, _token_id) {
WhitelistData memory whitelist = whitelist_datas[_token_id][_whitelist_index];
editWhitelist(whitelist, _token_id, _whitelist_index, _merkle_root, _active, whitelist.token_price, whitelist.max_per_wallet, _use_dynamic_price);
}
function editWhitelist(WhitelistData memory _whitelist, uint256 _token_id, uint256 _whitelist_index, bytes32 _merkle_root, bool _active,
uint128 _wl_price, uint8 _wl_max_per_wallet, bool _use_dynamic_price) internal {
if(_merkle_root == "") revert WrongRoot();
_whitelist.merkle_root = _merkle_root;
_whitelist.active = _active;
_whitelist.token_price = _wl_price;
_whitelist.max_per_wallet = _wl_max_per_wallet;
_whitelist.use_dynamic_price = _use_dynamic_price;
whitelist_datas[_token_id][_whitelist_index] = _whitelist;
}
function getWhiteListAtIndex(uint256 _token_id, uint256 _whitelist_index) public view whitelistExist(_whitelist_index, _token_id)
returns(WhitelistData memory) {
return whitelist_datas[_token_id][_whitelist_index];
}
function getWhiteListLengthForToken(uint256 _token_id) external view returns(uint256) {
return whitelist_datas[_token_id].length;
}
function getMintTotalPrice(address account, uint256 token_id, uint256 whitelist_index, uint256 amount) external view whitelistExist(whitelist_index, token_id)
returns(uint256 price) {
WhitelistData memory _whitelist = getWhiteListAtIndex(token_id, whitelist_index);
if (_whitelist.use_dynamic_price) {
return super.extractTotalPrice(token_id, _whitelist.token_price, token_datas[token_id].total_supply, token_datas[token_id].mints_count[account], amount);
}
return _whitelist.token_price * amount;
}
function initFront(address account, uint256 token_id, uint256 whitelist_index) public view whitelistExist(whitelist_index, token_id)
returns(ReturnData memory rd){
rd = super.initFront(account, token_id);
WhitelistData memory wl = getWhiteListAtIndex(token_id, whitelist_index);
rd.max_per_wallet = wl.max_per_wallet;
rd.base_price = wl.token_price;
rd.active = wl.active;
rd.use_dynamic_price = wl.use_dynamic_price;
}
function elligible_claim(uint256 _amount, uint256 _token_id, uint256 _whitelist_index, bytes32[] calldata _merkleProof) view internal
returns(uint256 total) {
WhitelistData storage whitelist = whitelist_datas[_token_id][_whitelist_index];
if(!whitelist.active) revert InactiveWhitelist();
if(!MerkleProof.verifyCalldata(_merkleProof, whitelist.merkle_root, keccak256(abi.encodePacked(msg.sender)))) revert InvalidProof();
return super.elligible_mint(_token_id, _amount, whitelist.use_dynamic_price, whitelist.max_per_wallet, whitelist.token_price);
}
}
文件 11 的 22:IERC1155.sol
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
interface IERC1155 is IERC165 {
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
event TransferBatch(
address indexed operator,
address indexed from,
address indexed to,
uint256[] ids,
uint256[] values
);
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
event URI(string value, uint256 indexed id);
function balanceOf(address account, uint256 id) external view returns (uint256);
function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
external
view
returns (uint256[] memory);
function setApprovalForAll(address operator, bool approved) external;
function isApprovedForAll(address account, address operator) external view returns (bool);
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes calldata data
) external;
function safeBatchTransferFrom(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata amounts,
bytes calldata data
) external;
}
文件 12 的 22:IERC1155MetadataURI.sol
pragma solidity ^0.8.0;
import "../IERC1155.sol";
interface IERC1155MetadataURI is IERC1155 {
function uri(uint256 id) external view returns (string memory);
}
文件 13 的 22:IERC1155Receiver.sol
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
interface IERC1155Receiver is IERC165 {
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
) external returns (bytes4);
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
) external returns (bytes4);
}
文件 14 的 22:IERC165.sol
pragma solidity ^0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 15 的 22:IERC2981.sol
pragma solidity ^0.8.0;
import "../utils/introspection/IERC165.sol";
interface IERC2981 is IERC165 {
function royaltyInfo(uint256 tokenId, uint256 salePrice)
external
view
returns (address receiver, uint256 royaltyAmount);
}
文件 16 的 22:IOperatorFilterRegistry.sol
pragma solidity ^0.8.13;
interface IOperatorFilterRegistry {
function isOperatorAllowed(address registrant, address operator) external view returns (bool);
function register(address registrant) external;
function registerAndSubscribe(address registrant, address subscription) external;
function registerAndCopyEntries(address registrant, address registrantToCopy) external;
function unregister(address addr) external;
function updateOperator(address registrant, address operator, bool filtered) external;
function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
function subscribe(address registrant, address registrantToSubscribe) external;
function unsubscribe(address registrant, bool copyExistingEntries) external;
function subscriptionOf(address addr) external returns (address registrant);
function subscribers(address registrant) external returns (address[] memory);
function subscriberAt(address registrant, uint256 index) external returns (address);
function copyEntriesOf(address registrant, address registrantToCopy) external;
function isOperatorFiltered(address registrant, address operator) external returns (bool);
function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
function filteredOperators(address addr) external returns (address[] memory);
function filteredCodeHashes(address addr) external returns (bytes32[] memory);
function filteredOperatorAt(address registrant, uint256 index) external returns (address);
function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
function isRegistered(address addr) external returns (bool);
function codeHashOf(address addr) external returns (bytes32);
}
文件 17 的 22:Math.sol
pragma solidity ^0.8.0;
library Math {
enum Rounding {
Down,
Up,
Zero
}
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
function average(uint256 a, uint256 b) internal pure returns (uint256) {
return (a & b) + (a ^ b) / 2;
}
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
return a == 0 ? 0 : (a - 1) / b + 1;
}
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator
) internal pure returns (uint256 result) {
unchecked {
uint256 prod0;
uint256 prod1;
assembly {
let mm := mulmod(x, y, not(0))
prod0 := mul(x, y)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
if (prod1 == 0) {
return prod0 / denominator;
}
require(denominator > prod1);
uint256 remainder;
assembly {
remainder := mulmod(x, y, denominator)
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
uint256 twos = denominator & (~denominator + 1);
assembly {
denominator := div(denominator, twos)
prod0 := div(prod0, twos)
twos := add(div(sub(0, twos), twos), 1)
}
prod0 |= prod1 * twos;
uint256 inverse = (3 * denominator) ^ 2;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
result = prod0 * inverse;
return result;
}
}
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator,
Rounding rounding
) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 result = 1 << (log2(a) >> 1);
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
}
}
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
}
}
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10**64) {
value /= 10**64;
result += 64;
}
if (value >= 10**32) {
value /= 10**32;
result += 32;
}
if (value >= 10**16) {
value /= 10**16;
result += 16;
}
if (value >= 10**8) {
value /= 10**8;
result += 8;
}
if (value >= 10**4) {
value /= 10**4;
result += 4;
}
if (value >= 10**2) {
value /= 10**2;
result += 2;
}
if (value >= 10**1) {
result += 1;
}
}
return result;
}
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
}
}
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
}
}
}
文件 18 的 22:MerkleProof.sol
pragma solidity ^0.8.0;
library MerkleProof {
function verify(
bytes32[] memory proof,
bytes32 root,
bytes32 leaf
) internal pure returns (bool) {
return processProof(proof, leaf) == root;
}
function verifyCalldata(
bytes32[] calldata proof,
bytes32 root,
bytes32 leaf
) internal pure returns (bool) {
return processProofCalldata(proof, leaf) == root;
}
function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
function multiProofVerify(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProof(proof, proofFlags, leaves) == root;
}
function multiProofVerifyCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProofCalldata(proof, proofFlags, leaves) == root;
}
function processMultiProof(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
uint256 leavesLen = leaves.length;
uint256 totalHashes = proofFlags.length;
require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
return hashes[totalHashes - 1];
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
function processMultiProofCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
uint256 leavesLen = leaves.length;
uint256 totalHashes = proofFlags.length;
require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
return hashes[totalHashes - 1];
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
}
function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
assembly {
mstore(0x00, a)
mstore(0x20, b)
value := keccak256(0x00, 0x40)
}
}
}
文件 19 的 22:OperatorFilterer.sol
pragma solidity ^0.8.13;
import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol";
import {CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS} from "./lib/Constants.sol";
abstract contract OperatorFilterer {
error OperatorNotAllowed(address operator);
IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS);
constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
if (subscribe) {
OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
} else {
if (subscriptionOrRegistrantToCopy != address(0)) {
OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
} else {
OPERATOR_FILTER_REGISTRY.register(address(this));
}
}
}
}
modifier onlyAllowedOperator(address from) virtual {
if (from != msg.sender) {
_checkFilterOperator(msg.sender);
}
_;
}
modifier onlyAllowedOperatorApproval(address operator) virtual {
_checkFilterOperator(operator);
_;
}
function _checkFilterOperator(address operator) internal view virtual {
if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
revert OperatorNotAllowed(operator);
}
}
}
}
文件 20 的 22: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);
}
}
文件 21 的 22:Pausable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Pausable is Context {
event Paused(address account);
event Unpaused(address account);
bool private _paused;
constructor() {
_paused = false;
}
modifier whenNotPaused() {
_requireNotPaused();
_;
}
modifier whenPaused() {
_requirePaused();
_;
}
function paused() public view virtual returns (bool) {
return _paused;
}
function _requireNotPaused() internal view virtual {
require(!paused(), "Pausable: paused");
}
function _requirePaused() internal view virtual {
require(paused(), "Pausable: not paused");
}
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
文件 22 的 22:Strings.sol
pragma solidity ^0.8.0;
import "./math/Math.sol";
library Strings {
bytes16 private constant _SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, Math.log256(value) + 1);
}
}
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}
{
"compilationTarget": {
"contracts/EnsanEditions.sol": "EnsanEditions"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 500
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ContractMint","type":"error"},{"inputs":[],"name":"ExistingToken","type":"error"},{"inputs":[],"name":"InactiveWhitelist","type":"error"},{"inputs":[],"name":"IndexOutOfRange","type":"error"},{"inputs":[],"name":"InsufficentFunds","type":"error"},{"inputs":[],"name":"InvalidProof","type":"error"},{"inputs":[],"name":"InvalidRoyaltyShare","type":"error"},{"inputs":[],"name":"InvalidRule","type":"error"},{"inputs":[],"name":"ListFull","type":"error"},{"inputs":[],"name":"MaxCount","type":"error"},{"inputs":[],"name":"MaxSupply","type":"error"},{"inputs":[],"name":"NotTokenOwnerOrAuthorised","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"SaleClosed","type":"error"},{"inputs":[],"name":"TokenLockedBySupply","type":"error"},{"inputs":[],"name":"TokenNotFound","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"Unburnable","type":"error"},{"inputs":[],"name":"UnknownModifier","type":"error"},{"inputs":[],"name":"WrongRoot","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"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":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_tokenUri","type":"string"},{"internalType":"bool","name":"_tokenPublicSale","type":"bool"},{"internalType":"bool","name":"_tokenBurnable","type":"bool"},{"internalType":"uint32","name":"_tokenMaxSupply","type":"uint32"},{"internalType":"uint16","name":"_tokenMaxMintsPerWallet","type":"uint16"},{"internalType":"uint128","name":"price_in_wei","type":"uint128"},{"internalType":"uint16","name":"_tokenRoyaltyShare","type":"uint16"},{"internalType":"address","name":"_tokenRoyaltyRecipient","type":"address"},{"internalType":"bool","name":"_use_dynamic_price","type":"bool"}],"name":"addNewToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_tokenUri","type":"string"}],"name":"addNewTokenLight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_token_id","type":"uint256"},{"internalType":"uint128","name":"_wl_price_in_wei","type":"uint128"},{"internalType":"bytes32","name":"_merkle_root","type":"bytes32"},{"internalType":"uint8","name":"_wl_max_per_wallet","type":"uint8"},{"internalType":"bool","name":"_active","type":"bool"},{"internalType":"bool","name":"_use_dynamic_price","type":"bool"}],"name":"addNewWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_token_id","type":"uint256"},{"components":[{"internalType":"uint128","name":"trigger","type":"uint128"},{"internalType":"uint128","name":"priceInWei","type":"uint128"}],"internalType":"struct GsDynamicPrice.PriceRule[]","name":"_ordered_rules","type":"tuple[]"}],"name":"addPriceRules","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"editor","type":"address"}],"name":"disableEditor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint32","name":"_maxSupply","type":"uint32"},{"internalType":"uint16","name":"_maxPerWallet","type":"uint16"},{"internalType":"uint128","name":"_price_in_wei","type":"uint128"}],"name":"editTokenMeta","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelist_index","type":"uint256"},{"internalType":"uint256","name":"_token_id","type":"uint256"},{"internalType":"uint128","name":"_wl_price_in_wei","type":"uint128"},{"internalType":"bytes32","name":"_merkle_root","type":"bytes32"},{"internalType":"uint8","name":"_wl_max_per_wallet","type":"uint8"},{"internalType":"bool","name":"_active","type":"bool"},{"internalType":"bool","name":"_use_dynamic_price","type":"bool"}],"name":"editWhitelistFull","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelist_index","type":"uint256"},{"internalType":"uint256","name":"_token_id","type":"uint256"},{"internalType":"bytes32","name":"_merkle_root","type":"bytes32"},{"internalType":"bool","name":"_active","type":"bool"},{"internalType":"bool","name":"_use_dynamic_price","type":"bool"}],"name":"editWhitelistPartial","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"editor","type":"address"}],"name":"enableEditor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getDefaultTokenData","outputs":[{"components":[{"internalType":"uint128","name":"base_price","type":"uint128"},{"internalType":"uint16","name":"royalty_share","type":"uint16"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bool","name":"burnable","type":"bool"},{"internalType":"bool","name":"use_dynamic_price","type":"bool"},{"internalType":"bool","name":"isPaused","type":"bool"},{"internalType":"uint32","name":"max_supply","type":"uint32"},{"internalType":"uint32","name":"total_supply","type":"uint32"},{"internalType":"uint16","name":"max_per_wallet","type":"uint16"},{"internalType":"address","name":"royalty_recipient","type":"address"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint256","name":"mints_count","type":"uint256"}],"internalType":"struct GsERC1155.ReturnData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"token_id","type":"uint256"},{"internalType":"uint256","name":"whitelist_index","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getMintTotalPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"token_id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getMintTotalPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_token_id","type":"uint256"},{"internalType":"uint8","name":"_priority_index","type":"uint8"}],"name":"getPriceRules","outputs":[{"internalType":"enum GsERC1155.PriceCondition","name":"","type":"uint8"},{"components":[{"internalType":"uint128","name":"trigger","type":"uint128"},{"internalType":"uint128","name":"priceInWei","type":"uint128"}],"internalType":"struct GsDynamicPrice.PriceRule[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getTokenData","outputs":[{"components":[{"internalType":"uint128","name":"base_price","type":"uint128"},{"internalType":"uint16","name":"royalty_share","type":"uint16"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bool","name":"burnable","type":"bool"},{"internalType":"bool","name":"use_dynamic_price","type":"bool"},{"internalType":"bool","name":"isPaused","type":"bool"},{"internalType":"uint32","name":"max_supply","type":"uint32"},{"internalType":"uint32","name":"total_supply","type":"uint32"},{"internalType":"uint16","name":"max_per_wallet","type":"uint16"},{"internalType":"address","name":"royalty_recipient","type":"address"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint256","name":"mints_count","type":"uint256"}],"internalType":"struct GsERC1155.ReturnData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_token_id","type":"uint256"},{"internalType":"uint256","name":"_whitelist_index","type":"uint256"}],"name":"getWhiteListAtIndex","outputs":[{"components":[{"internalType":"bytes32","name":"merkle_root","type":"bytes32"},{"internalType":"uint128","name":"token_price","type":"uint128"},{"internalType":"uint8","name":"max_per_wallet","type":"uint8"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bool","name":"use_dynamic_price","type":"bool"}],"internalType":"struct GsERC1155Merkle.WhitelistData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_token_id","type":"uint256"}],"name":"getWhiteListLengthForToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"token_id","type":"uint256"}],"name":"initFront","outputs":[{"components":[{"internalType":"uint128","name":"base_price","type":"uint128"},{"internalType":"uint16","name":"royalty_share","type":"uint16"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bool","name":"burnable","type":"bool"},{"internalType":"bool","name":"use_dynamic_price","type":"bool"},{"internalType":"bool","name":"isPaused","type":"bool"},{"internalType":"uint32","name":"max_supply","type":"uint32"},{"internalType":"uint32","name":"total_supply","type":"uint32"},{"internalType":"uint16","name":"max_per_wallet","type":"uint16"},{"internalType":"address","name":"royalty_recipient","type":"address"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint256","name":"mints_count","type":"uint256"}],"internalType":"struct GsERC1155.ReturnData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"token_id","type":"uint256"},{"internalType":"uint256","name":"whitelist_index","type":"uint256"}],"name":"initFront","outputs":[{"components":[{"internalType":"uint128","name":"base_price","type":"uint128"},{"internalType":"uint16","name":"royalty_share","type":"uint16"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bool","name":"burnable","type":"bool"},{"internalType":"bool","name":"use_dynamic_price","type":"bool"},{"internalType":"bool","name":"isPaused","type":"bool"},{"internalType":"uint32","name":"max_supply","type":"uint32"},{"internalType":"uint32","name":"total_supply","type":"uint32"},{"internalType":"uint16","name":"max_per_wallet","type":"uint16"},{"internalType":"address","name":"royalty_recipient","type":"address"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint256","name":"mints_count","type":"uint256"}],"internalType":"struct GsERC1155.ReturnData","name":"rd","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_token_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_token_id","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"oMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"price_condition_priority","outputs":[{"internalType":"enum GsERC1155.PriceCondition","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reversePriceConditionPriority","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_token_id","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_publicSale","type":"bool"},{"internalType":"bool","name":"_burnable","type":"bool"},{"internalType":"bool","name":"_use_dynamic_price","type":"bool"}],"name":"setDefaultModifiers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint16","name":"_share","type":"uint16"}],"name":"setDefaultRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_maxSupply","type":"uint32"},{"internalType":"uint8","name":"_maxPerWallet","type":"uint8"},{"internalType":"uint128","name":"_price_in_wei","type":"uint128"}],"name":"setDefaultTokenMeta","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint16","name":"_share","type":"uint16"},{"internalType":"bool","name":"_publicSale","type":"bool"},{"internalType":"bool","name":"_burnable","type":"bool"},{"internalType":"bool","name":"_use_dynamic_price","type":"bool"},{"internalType":"uint32","name":"_maxSupply","type":"uint32"},{"internalType":"uint8","name":"_maxMintsPerWallet","type":"uint8"},{"internalType":"uint128","name":"_price_in_wei","type":"uint128"}],"name":"setDefaults","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_token_id","type":"uint256"},{"internalType":"uint32","name":"_type","type":"uint32"},{"internalType":"bool","name":"_value","type":"bool"}],"name":"setModifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_token_id","type":"uint256"},{"internalType":"address","name":"_newRecipient","type":"address"},{"internalType":"uint8","name":"_newShare","type":"uint8"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_token_id","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_token_id","type":"uint256"},{"internalType":"uint8","name":"_priority_index","type":"uint8"},{"components":[{"internalType":"uint128","name":"trigger","type":"uint128"},{"internalType":"uint128","name":"priceInWei","type":"uint128"}],"internalType":"struct GsDynamicPrice.PriceRule[]","name":"_ordered_rules","type":"tuple[]"}],"name":"updatePriceRules","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_token_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"token_id","type":"uint256"},{"internalType":"uint256","name":"wlIndex","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"wlMint","outputs":[],"stateMutability":"payable","type":"function"}]