Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| 0x60806040 | 23932602 | 2 hrs ago | Contract Creation | 0 ETH |
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
GenAiNftDiamondInit
Compiler Version
v0.8.23+commit.f704f362
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.8.23;
import { AccessControlInternal } from "@solidstate/contracts/access/access_control/AccessControlInternal.sol";
import { AccessControlStorage } from "@solidstate/contracts/access/access_control/AccessControlStorage.sol";
import { IAccessControl } from "@solidstate/contracts/access/access_control/IAccessControl.sol";
import { ERC721MetadataStorage } from "@solidstate/contracts/token/ERC721/metadata/ERC721MetadataStorage.sol";
import { ERC165BaseStorage } from "@solidstate/contracts/introspection/ERC165/base/ERC165BaseStorage.sol";
import { IERC165 } from "@solidstate/contracts/interfaces/IERC165.sol";
import { IERC721 } from "@solidstate/contracts/interfaces/IERC721.sol";
import { IERC721Metadata } from "@solidstate/contracts/token/ERC721/metadata/IERC721Metadata.sol";
import { IERC721Enumerable } from "@solidstate/contracts/token/ERC721/enumerable/IERC721Enumerable.sol";
import { LibGenAiNftStorage } from "../libraries/LibGenAiNftStorage.sol";
import { IGenAiNft } from "../interfaces/IGenAiNft.sol";
/**
* @title GenAiNftDiamondInit
* @dev Initializer contract for Generative AI NFT Diamond
* This contract is called once during diamond creation to initialize state
*/
contract GenAiNftDiamondInit is AccessControlInternal {
/**
* @dev Initialize the GenAiNft diamond with initial parameters
* @param params Initial configuration parameters
*/
function init(IGenAiNft.InitParams memory params) external {
require(params.adminAddress != address(0), "GenAiNft: Invalid admin address");
require(bytes(params.name).length > 0, "GenAiNft: Empty name");
require(bytes(params.symbol).length > 0, "GenAiNft: Empty symbol");
// Initialize our custom storage
LibGenAiNftStorage.DiamondStorage storage ds = LibGenAiNftStorage.diamondStorage();
ds.baseURI = params.baseURI;
ds.maxSupply = params.maxSupply;
// Initialize ERC721 metadata storage (SolidState)
ERC721MetadataStorage.Layout storage ems = ERC721MetadataStorage.layout();
ems.name = params.name;
ems.symbol = params.symbol;
ems.baseURI = params.baseURI;
// Register supported interfaces for ERC165
ERC165BaseStorage.layout().supportedInterfaces[type(IERC721).interfaceId] = true;
ERC165BaseStorage.layout().supportedInterfaces[type(IERC721Metadata).interfaceId] = true;
ERC165BaseStorage.layout().supportedInterfaces[type(IERC721Enumerable).interfaceId] = true;
ERC165BaseStorage.layout().supportedInterfaces[type(IAccessControl).interfaceId] = true;
ERC165BaseStorage.layout().supportedInterfaces[type(IERC165).interfaceId] = true;
// Grant admin role
_grantRole(AccessControlStorage.DEFAULT_ADMIN_ROLE, params.adminAddress);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { EnumerableSet } from '../../data/EnumerableSet.sol';
import { AddressUtils } from '../../utils/AddressUtils.sol';
import { UintUtils } from '../../utils/UintUtils.sol';
import { IAccessControlInternal } from './IAccessControlInternal.sol';
import { AccessControlStorage } from './AccessControlStorage.sol';
/**
* @title Role-based access control system
* @dev derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT license)
*/
abstract contract AccessControlInternal is IAccessControlInternal {
using AddressUtils for address;
using EnumerableSet for EnumerableSet.AddressSet;
using UintUtils for uint256;
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
/*
* @notice query whether role is assigned to account
* @param role role to query
* @param account account to query
* @return whether role is assigned to account
*/
function _hasRole(
bytes32 role,
address account
) internal view virtual returns (bool) {
return
AccessControlStorage.layout().roles[role].members.contains(account);
}
/**
* @notice revert if sender does not have given role
* @param role role to query
*/
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, msg.sender);
}
/**
* @notice revert if given account does not have given role
* @param role role to query
* @param account to query
*/
function _checkRole(bytes32 role, address account) internal view virtual {
if (!_hasRole(role, account)) {
revert(
string(
abi.encodePacked(
'AccessControl: account ',
account.toString(),
' is missing role ',
uint256(role).toHexString(32)
)
)
);
}
}
/*
* @notice query admin role for given role
* @param role role to query
* @return admin role
*/
function _getRoleAdmin(
bytes32 role
) internal view virtual returns (bytes32) {
return AccessControlStorage.layout().roles[role].adminRole;
}
/**
* @notice set role as admin role
* @param role role to set
* @param adminRole admin role to set
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = _getRoleAdmin(role);
AccessControlStorage.layout().roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
/*
* @notice assign role to given account
* @param role role to assign
* @param account recipient of role assignment
*/
function _grantRole(bytes32 role, address account) internal virtual {
AccessControlStorage.layout().roles[role].members.add(account);
emit RoleGranted(role, account, msg.sender);
}
/*
* @notice unassign role from given account
* @param role role to unassign
* @parm account
*/
function _revokeRole(bytes32 role, address account) internal virtual {
AccessControlStorage.layout().roles[role].members.remove(account);
emit RoleRevoked(role, account, msg.sender);
}
/**
* @notice relinquish role
* @param role role to relinquish
*/
function _renounceRole(bytes32 role) internal virtual {
_revokeRole(role, msg.sender);
}
/**
* @notice query role for member at given index
* @param role role to query
* @param index index to query
*/
function _getRoleMember(
bytes32 role,
uint256 index
) internal view virtual returns (address) {
return AccessControlStorage.layout().roles[role].members.at(index);
}
/**
* @notice query role for member count
* @param role role to query
*/
function _getRoleMemberCount(
bytes32 role
) internal view virtual returns (uint256) {
return AccessControlStorage.layout().roles[role].members.length();
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { EnumerableSet } from '../../data/EnumerableSet.sol';
library AccessControlStorage {
struct RoleData {
EnumerableSet.AddressSet members;
bytes32 adminRole;
}
struct Layout {
mapping(bytes32 => RoleData) roles;
}
bytes32 internal constant DEFAULT_ADMIN_ROLE = 0x00;
bytes32 internal constant STORAGE_SLOT =
keccak256('solidstate.contracts.storage.AccessControl');
function layout() internal pure returns (Layout storage l) {
bytes32 slot = STORAGE_SLOT;
assembly {
l.slot := slot
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { IAccessControlInternal } from './IAccessControlInternal.sol';
/**
* @title AccessControl interface
*/
interface IAccessControl is IAccessControlInternal {
/*
* @notice query whether role is assigned to account
* @param role role to query
* @param account account to query
* @return whether role is assigned to account
*/
function hasRole(
bytes32 role,
address account
) external view returns (bool);
/*
* @notice query admin role for given role
* @param role role to query
* @return admin role
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/*
* @notice assign role to given account
* @param role role to assign
* @param account recipient of role assignment
*/
function grantRole(bytes32 role, address account) external;
/*
* @notice unassign role from given account
* @param role role to unassign
* @parm account
*/
function revokeRole(bytes32 role, address account) external;
/**
* @notice relinquish role
* @param role role to relinquish
*/
function renounceRole(bytes32 role) external;
/**
* @notice Returns one of the accounts that have `role`. `index` must be a
* value between 0 and {getRoleMemberCount}, non-inclusive.
*
* Role bearers are not sorted in any particular way, and their ordering may
* change at any point.
*
* WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
* you perform all queries on the same block. See the following
* https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
* for more information.
*/
function getRoleMember(
bytes32 role,
uint256 index
) external view returns (address);
/**
* @notice Returns the number of accounts that have `role`. Can be used
* together with {getRoleMember} to enumerate all bearers of a role.
*/
function getRoleMemberCount(bytes32 role) external view returns (uint256);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @title Partial AccessControl interface needed by internal functions
*/
interface IAccessControlInternal {
event RoleAdminChanged(
bytes32 indexed role,
bytes32 indexed previousAdminRole,
bytes32 indexed newAdminRole
);
event RoleGranted(
bytes32 indexed role,
address indexed account,
address indexed sender
);
event RoleRevoked(
bytes32 indexed role,
address indexed account,
address indexed sender
);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
/**
* @title Set implementation with enumeration functions
* @dev derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT license)
*/
library EnumerableSet {
error EnumerableSet__IndexOutOfBounds();
struct Set {
bytes32[] _values;
// 1-indexed to allow 0 to signify nonexistence
mapping(bytes32 => uint256) _indexes;
}
struct Bytes32Set {
Set _inner;
}
struct AddressSet {
Set _inner;
}
struct UintSet {
Set _inner;
}
function at(
Bytes32Set storage set,
uint256 index
) internal view returns (bytes32) {
return _at(set._inner, index);
}
function at(
AddressSet storage set,
uint256 index
) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
function at(
UintSet storage set,
uint256 index
) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
function contains(
Bytes32Set storage set,
bytes32 value
) internal view returns (bool) {
return _contains(set._inner, value);
}
function contains(
AddressSet storage set,
address value
) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
function contains(
UintSet storage set,
uint256 value
) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
function indexOf(
Bytes32Set storage set,
bytes32 value
) internal view returns (uint256) {
return _indexOf(set._inner, value);
}
function indexOf(
AddressSet storage set,
address value
) internal view returns (uint256) {
return _indexOf(set._inner, bytes32(uint256(uint160(value))));
}
function indexOf(
UintSet storage set,
uint256 value
) internal view returns (uint256) {
return _indexOf(set._inner, bytes32(value));
}
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
function add(
Bytes32Set storage set,
bytes32 value
) internal returns (bool) {
return _add(set._inner, value);
}
function add(
AddressSet storage set,
address value
) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
function remove(
Bytes32Set storage set,
bytes32 value
) internal returns (bool) {
return _remove(set._inner, value);
}
function remove(
AddressSet storage set,
address value
) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
function remove(
UintSet storage set,
uint256 value
) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
function toArray(
Bytes32Set storage set
) internal view returns (bytes32[] memory) {
return set._inner._values;
}
function toArray(
AddressSet storage set
) internal view returns (address[] memory) {
bytes32[] storage values = set._inner._values;
address[] storage array;
assembly {
array.slot := values.slot
}
return array;
}
function toArray(
UintSet storage set
) internal view returns (uint256[] memory) {
bytes32[] storage values = set._inner._values;
uint256[] storage array;
assembly {
array.slot := values.slot
}
return array;
}
function _at(
Set storage set,
uint256 index
) private view returns (bytes32) {
if (index >= set._values.length)
revert EnumerableSet__IndexOutOfBounds();
return set._values[index];
}
function _contains(
Set storage set,
bytes32 value
) private view returns (bool) {
return set._indexes[value] != 0;
}
function _indexOf(
Set storage set,
bytes32 value
) private view returns (uint256) {
unchecked {
return set._indexes[value] - 1;
}
}
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
function _add(
Set storage set,
bytes32 value
) private returns (bool status) {
if (!_contains(set, value)) {
set._values.push(value);
set._indexes[value] = set._values.length;
status = true;
}
}
function _remove(
Set storage set,
bytes32 value
) private returns (bool status) {
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) {
unchecked {
bytes32 last = set._values[set._values.length - 1];
// move last value to now-vacant index
set._values[valueIndex - 1] = last;
set._indexes[last] = valueIndex;
}
// clear last index
set._values.pop();
delete set._indexes[value];
status = true;
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
import { IERC165Internal } from './IERC165Internal.sol';
/**
* @title ERC165 interface registration interface
* @dev see https://eips.ethereum.org/EIPS/eip-165
*/
interface IERC165 is IERC165Internal {
/**
* @notice query whether contract has registered support for given interface
* @param interfaceId interface id
* @return bool whether interface is supported
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
/**
* @title ERC165 interface registration interface
*/
interface IERC165Internal {
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
import { IERC165 } from './IERC165.sol';
import { IERC721Internal } from './IERC721Internal.sol';
/**
* @title ERC721 interface
* @dev see https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721 is IERC721Internal, IERC165 {
/**
* @notice query the balance of given address
* @return balance quantity of tokens held
*/
function balanceOf(address account) external view returns (uint256 balance);
/**
* @notice query the owner of given token
* @param tokenId token to query
* @return owner token owner
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @notice transfer token between given addresses, checking for ERC721Receiver implementation if applicable
* @param from sender of token
* @param to receiver of token
* @param tokenId token id
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external payable;
/**
* @notice transfer token between given addresses, checking for ERC721Receiver implementation if applicable
* @param from sender of token
* @param to receiver of token
* @param tokenId token id
* @param data data payload
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external payable;
/**
* @notice transfer token between given addresses, without checking for ERC721Receiver implementation if applicable
* @param from sender of token
* @param to receiver of token
* @param tokenId token id
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external payable;
/**
* @notice grant approval to given account to spend token
* @param operator address to be approved
* @param tokenId token to approve
*/
function approve(address operator, uint256 tokenId) external payable;
/**
* @notice get approval status for given token
* @param tokenId token to query
* @return operator address approved to spend token
*/
function getApproved(
uint256 tokenId
) external view returns (address operator);
/**
* @notice grant approval to or revoke approval from given account to spend all tokens held by sender
* @param operator address to be approved
* @param status approval status
*/
function setApprovalForAll(address operator, bool status) external;
/**
* @notice query approval status of given operator with respect to given address
* @param account address to query for approval granted
* @param operator address to query for approval received
* @return status whether operator is approved to spend tokens held by account
*/
function isApprovedForAll(
address account,
address operator
) external view returns (bool status);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
/**
* @title Partial ERC721 interface needed by internal functions
*/
interface IERC721Internal {
event Transfer(
address indexed from,
address indexed to,
uint256 indexed tokenId
);
event Approval(
address indexed owner,
address indexed operator,
uint256 indexed tokenId
);
event ApprovalForAll(
address indexed owner,
address indexed operator,
bool approved
);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
library ERC165BaseStorage {
struct Layout {
mapping(bytes4 => bool) supportedInterfaces;
}
bytes32 internal constant STORAGE_SLOT =
keccak256('solidstate.contracts.storage.ERC165Base');
function layout() internal pure returns (Layout storage l) {
bytes32 slot = STORAGE_SLOT;
assembly {
l.slot := slot
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
import { IERC721Internal } from '../../../interfaces/IERC721Internal.sol';
/**
* @title ERC721 base interface
*/
interface IERC721BaseInternal is IERC721Internal {
error ERC721Base__NotOwnerOrApproved();
error ERC721Base__SelfApproval();
error ERC721Base__BalanceQueryZeroAddress();
error ERC721Base__ERC721ReceiverNotImplemented();
error ERC721Base__InvalidOwner();
error ERC721Base__MintToZeroAddress();
error ERC721Base__NonExistentToken();
error ERC721Base__NotTokenOwner();
error ERC721Base__TokenAlreadyMinted();
error ERC721Base__TransferToZeroAddress();
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
interface IERC721Enumerable {
/**
* @notice get total token supply
* @return total supply
*/
function totalSupply() external view returns (uint256);
/**
* @notice get token of given owner at given internal storage index
* @param owner token holder to query
* @param index position in owner's token list to query
* @return tokenId id of retrieved token
*/
function tokenOfOwnerByIndex(
address owner,
uint256 index
) external view returns (uint256 tokenId);
/**
* @notice get token at given internal storage index
* @param index position in global token list to query
* @return tokenId id of retrieved token
*/
function tokenByIndex(
uint256 index
) external view returns (uint256 tokenId);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
library ERC721MetadataStorage {
bytes32 internal constant STORAGE_SLOT =
keccak256('solidstate.contracts.storage.ERC721Metadata');
struct Layout {
string name;
string symbol;
string baseURI;
mapping(uint256 => string) tokenURIs;
}
function layout() internal pure returns (Layout storage l) {
bytes32 slot = STORAGE_SLOT;
assembly {
l.slot := slot
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
import { IERC721MetadataInternal } from './IERC721MetadataInternal.sol';
/**
* @title ERC721Metadata interface
*/
interface IERC721Metadata is IERC721MetadataInternal {
/**
* @notice get token name
* @return token name
*/
function name() external view returns (string memory);
/**
* @notice get token symbol
* @return token symbol
*/
function symbol() external view returns (string memory);
/**
* @notice get generated URI for given token
* @return token URI
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
import { IERC721BaseInternal } from '../base/IERC721BaseInternal.sol';
/**
* @title ERC721Metadata internal interface
*/
interface IERC721MetadataInternal is IERC721BaseInternal {
error ERC721Metadata__NonExistentToken();
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
import { UintUtils } from './UintUtils.sol';
library AddressUtils {
using UintUtils for uint256;
error AddressUtils__InsufficientBalance();
error AddressUtils__NotContract();
error AddressUtils__SendValueFailed();
function toString(address account) internal pure returns (string memory) {
return uint256(uint160(account)).toHexString(20);
}
function isContract(address account) internal view returns (bool) {
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
function sendValue(address payable account, uint256 amount) internal {
(bool success, ) = account.call{ value: amount }('');
if (!success) revert AddressUtils__SendValueFailed();
}
function functionCall(
address target,
bytes memory data
) internal returns (bytes memory) {
return
functionCall(target, data, 'AddressUtils: failed low-level call');
}
function functionCall(
address target,
bytes memory data,
string memory error
) internal returns (bytes memory) {
return _functionCallWithValue(target, data, 0, error);
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return
functionCallWithValue(
target,
data,
value,
'AddressUtils: failed low-level call with value'
);
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory error
) internal returns (bytes memory) {
if (value > address(this).balance)
revert AddressUtils__InsufficientBalance();
return _functionCallWithValue(target, data, value, error);
}
/**
* @notice execute arbitrary external call with limited gas usage and amount of copied return data
* @dev derived from https://github.com/nomad-xyz/ExcessivelySafeCall (MIT License)
* @param target recipient of call
* @param gasAmount gas allowance for call
* @param value native token value to include in call
* @param maxCopy maximum number of bytes to copy from return data
* @param data encoded call data
* @return success whether call is successful
* @return returnData copied return data
*/
function excessivelySafeCall(
address target,
uint256 gasAmount,
uint256 value,
uint16 maxCopy,
bytes memory data
) internal returns (bool success, bytes memory returnData) {
returnData = new bytes(maxCopy);
assembly {
// execute external call via assembly to avoid automatic copying of return data
success := call(
gasAmount,
target,
value,
add(data, 0x20),
mload(data),
0,
0
)
// determine whether to limit amount of data to copy
let toCopy := returndatasize()
if gt(toCopy, maxCopy) {
toCopy := maxCopy
}
// store the length of the copied bytes
mstore(returnData, toCopy)
// copy the bytes from returndata[0:toCopy]
returndatacopy(add(returnData, 0x20), 0, toCopy)
}
}
function _functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory error
) private returns (bytes memory) {
if (!isContract(target)) revert AddressUtils__NotContract();
(bool success, bytes memory returnData) = target.call{ value: value }(
data
);
if (success) {
return returnData;
} else if (returnData.length > 0) {
assembly {
let returnData_size := mload(returnData)
revert(add(32, returnData), returnData_size)
}
} else {
revert(error);
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
/**
* @title utility functions for uint256 operations
* @dev derived from https://github.com/OpenZeppelin/openzeppelin-contracts/ (MIT license)
*/
library UintUtils {
error UintUtils__InsufficientHexLength();
bytes16 private constant HEX_SYMBOLS = '0123456789abcdef';
function add(uint256 a, int256 b) internal pure returns (uint256) {
return b < 0 ? sub(a, -b) : a + uint256(b);
}
function sub(uint256 a, int256 b) internal pure returns (uint256) {
return b < 0 ? add(a, -b) : a - uint256(b);
}
function toString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return '0';
}
uint256 temp = value;
uint256 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);
}
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return '0x00';
}
uint256 length = 0;
for (uint256 temp = value; temp != 0; temp >>= 8) {
unchecked {
length++;
}
}
return toHexString(value, length);
}
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';
unchecked {
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
}
if (value != 0) revert UintUtils__InsufficientHexLength();
return string(buffer);
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.23;
interface IGenAiNft {
struct InitParams {
string name;
string symbol;
string baseURI;
uint256 maxSupply;
address adminAddress;
}
// Events
event PublicMintToggled(bool enabled);
event MintPriceUpdated(uint256 newPrice);
event PublicMint(uint256 previousBlock, address indexed to, uint256 indexed tokenId, uint256 price);
event PublicBatchMint(uint256 previousBlock, address indexed to, uint256 quantity, uint256 totalPrice);
event RefundSent(address indexed to, uint256 amount);
event Withdrawn(address indexed recipient, uint256 amount);
// Admin functions
function mint(address account, string memory tokenURI_) external;
function mint(address account) external;
function batchMintWithURIs(address account, string[] memory tokenURIs) external;
function setPublicMintEnabled(bool enabled) external;
function setMintPrice(uint256 price) external;
function withdraw() external;
function withdrawTo(address payable recipient, uint256 amount) external;
function setBaseURI(string memory newBaseURI) external;
// Public functions
function publicMint(string memory tokenURI_) external payable;
function publicBatchMint(string[] memory tokenURIs) external payable;
// View functions
function baseURI() external view returns (string memory);
function maxSupply() external view returns (uint256);
function publicMintEnabled() external view returns (bool);
function mintPrice() external view returns (uint256);
function tokensOfOwner(address owner) external view returns (uint256[] memory);
function getLastBlockNumbers() external view returns (uint256 publicMintLastBlock, uint256 publicBatchMintLastBlock);
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.23;
/// @notice Storage for Generative AI NFT Diamond
library LibGenAiNftStorage {
bytes32 internal constant DIAMOND_STORAGE_POSITION = keccak256("tokenfi.genainft.diamond.storage");
struct DiamondStorage {
string baseURI;
uint256 maxSupply;
bool publicMintEnabled;
uint256 mintPrice; // Price in wei (native currency)
uint256 totalSupply;
uint256 publicMintLastBlock;
uint256 publicBatchMintLastBlock;
}
function diamondStorage() internal pure returns (DiamondStorage storage ds) {
bytes32 position = DIAMOND_STORAGE_POSITION;
// solhint-disable-next-line no-inline-assembly
assembly {
ds.slot := position
}
}
}{
"evmVersion": "london",
"metadata": {
"bytecodeHash": "none",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 10
},
"remappings": [],
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseURI","type":"string"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"address","name":"adminAddress","type":"address"}],"internalType":"struct IGenAiNft.InitParams","name":"params","type":"tuple"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b506106da806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80630c69332a14610030575b600080fd5b61004361003e3660046104b5565b610045565b005b60808101516001600160a01b03166100a45760405162461bcd60e51b815260206004820152601f60248201527f47656e41694e66743a20496e76616c69642061646d696e20616464726573730060448201526064015b60405180910390fd5b8051516100ea5760405162461bcd60e51b815260206004820152601460248201527347656e41694e66743a20456d707479206e616d6560601b604482015260640161009b565b6000816020015151116101385760405162461bcd60e51b815260206004820152601660248201527511d95b905a53999d0e88115b5c1d1e481cde5b589bdb60521b604482015260640161009b565b60408101517fc149a3a1fd728d88e2f9888bff3374f48427a6cdd80385eb2f04119e0e30115790819061016b908261060e565b506060820151600182015581517f99574a7094154bb123ae6ae102096f0bf9679b85a5cd1e727aaa0ae5f132e6b19081906101a6908261060e565b50602083015160018201906101bb908261060e565b50604083015160028201906101d0908261060e565b5060016101db6102d6565b6380ac58cd60e01b600090815260209190915260409020805460ff1916911515919091179055600161020b6102d6565b635b5e139f60e01b600090815260209190915260409020805460ff1916911515919091179055600161023b6102d6565b63780e9d6360e01b600090815260209190915260409020805460ff1916911515919091179055600161026b6102d6565b639e8f8c0560e01b600090815260209190915260409020805460ff1916911515919091179055600161029b6102d6565b6301ffc9a760e01b600090815260209190915260408120805460ff19169215159290921790915560808401516102d191906102fa565b505050565b7ffc606c433378e3a7e0a6a531deac289b66caa1b4aa8554fd4ab2c6f1570f92d890565b60008281527fd3889cc5458b268d0544e5534672df1296288ca3f93cbd39bd6f497a5c62281160205260409020610331908261036e565b5060405133906001600160a01b0383169084907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d90600090a45050565b6000610383836001600160a01b03841661038c565b90505b92915050565b6000818152600183016020526040812054610386575081546001808201845560008481526020808220909301849055845493815293810190915260409092205590565b634e487b7160e01b600052604160045260246000fd5b60405160a081016001600160401b0381118282101715610407576104076103cf565b60405290565b600082601f83011261041e57600080fd5b81356001600160401b0380821115610438576104386103cf565b604051601f8301601f19908116603f01168101908282118183101715610460576104606103cf565b8160405283815286602085880101111561047957600080fd5b836020870160208301376000602085830101528094505050505092915050565b80356001600160a01b03811681146104b057600080fd5b919050565b6000602082840312156104c757600080fd5b81356001600160401b03808211156104de57600080fd5b9083019060a082860312156104f257600080fd5b6104fa6103e5565b82358281111561050957600080fd5b6105158782860161040d565b82525060208301358281111561052a57600080fd5b6105368782860161040d565b60208301525060408301358281111561054e57600080fd5b61055a8782860161040d565b6040830152506060830135606082015261057660808401610499565b608082015295945050505050565b600181811c9082168061059857607f821691505b6020821081036105b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156102d1576000816000526020600020601f850160051c810160208610156105e75750805b601f850160051c820191505b81811015610606578281556001016105f3565b505050505050565b81516001600160401b03811115610627576106276103cf565b61063b816106358454610584565b846105be565b602080601f83116001811461067057600084156106585750858301515b600019600386901b1c1916600185901b178555610606565b600085815260208120601f198616915b8281101561069f57888601518255948401946001909101908401610680565b50858210156106bd5787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fea164736f6c6343000817000a
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80630c69332a14610030575b600080fd5b61004361003e3660046104b5565b610045565b005b60808101516001600160a01b03166100a45760405162461bcd60e51b815260206004820152601f60248201527f47656e41694e66743a20496e76616c69642061646d696e20616464726573730060448201526064015b60405180910390fd5b8051516100ea5760405162461bcd60e51b815260206004820152601460248201527347656e41694e66743a20456d707479206e616d6560601b604482015260640161009b565b6000816020015151116101385760405162461bcd60e51b815260206004820152601660248201527511d95b905a53999d0e88115b5c1d1e481cde5b589bdb60521b604482015260640161009b565b60408101517fc149a3a1fd728d88e2f9888bff3374f48427a6cdd80385eb2f04119e0e30115790819061016b908261060e565b506060820151600182015581517f99574a7094154bb123ae6ae102096f0bf9679b85a5cd1e727aaa0ae5f132e6b19081906101a6908261060e565b50602083015160018201906101bb908261060e565b50604083015160028201906101d0908261060e565b5060016101db6102d6565b6380ac58cd60e01b600090815260209190915260409020805460ff1916911515919091179055600161020b6102d6565b635b5e139f60e01b600090815260209190915260409020805460ff1916911515919091179055600161023b6102d6565b63780e9d6360e01b600090815260209190915260409020805460ff1916911515919091179055600161026b6102d6565b639e8f8c0560e01b600090815260209190915260409020805460ff1916911515919091179055600161029b6102d6565b6301ffc9a760e01b600090815260209190915260408120805460ff19169215159290921790915560808401516102d191906102fa565b505050565b7ffc606c433378e3a7e0a6a531deac289b66caa1b4aa8554fd4ab2c6f1570f92d890565b60008281527fd3889cc5458b268d0544e5534672df1296288ca3f93cbd39bd6f497a5c62281160205260409020610331908261036e565b5060405133906001600160a01b0383169084907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d90600090a45050565b6000610383836001600160a01b03841661038c565b90505b92915050565b6000818152600183016020526040812054610386575081546001808201845560008481526020808220909301849055845493815293810190915260409092205590565b634e487b7160e01b600052604160045260246000fd5b60405160a081016001600160401b0381118282101715610407576104076103cf565b60405290565b600082601f83011261041e57600080fd5b81356001600160401b0380821115610438576104386103cf565b604051601f8301601f19908116603f01168101908282118183101715610460576104606103cf565b8160405283815286602085880101111561047957600080fd5b836020870160208301376000602085830101528094505050505092915050565b80356001600160a01b03811681146104b057600080fd5b919050565b6000602082840312156104c757600080fd5b81356001600160401b03808211156104de57600080fd5b9083019060a082860312156104f257600080fd5b6104fa6103e5565b82358281111561050957600080fd5b6105158782860161040d565b82525060208301358281111561052a57600080fd5b6105368782860161040d565b60208301525060408301358281111561054e57600080fd5b61055a8782860161040d565b6040830152506060830135606082015261057660808401610499565b608082015295945050505050565b600181811c9082168061059857607f821691505b6020821081036105b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156102d1576000816000526020600020601f850160051c810160208610156105e75750805b601f850160051c820191505b81811015610606578281556001016105f3565b505050505050565b81516001600160401b03811115610627576106276103cf565b61063b816106358454610584565b846105be565b602080601f83116001811461067057600084156106585750858301515b600019600386901b1c1916600185901b178555610606565b600085815260208120601f198616915b8281101561069f57888601518255948401946001909101908401610680565b50858210156106bd5787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fea164736f6c6343000817000a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.