// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
interface IERC721 is IERC165 {
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
function balanceOf(address owner) external view returns (uint256 balance);
function ownerOf(uint256 tokenId) external view returns (address owner);
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
function safeTransferFrom(address from, address to, uint256 tokenId) external;
function transferFrom(address from, address to, uint256 tokenId) external;
function approve(address to, uint256 tokenId) external;
function setApprovalForAll(address operator, bool approved) external;
function getApproved(uint256 tokenId) external view returns (address operator);
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
interface IERC721Receiver {
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
interface IERC721Metadata is IERC721 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function tokenURI(uint256 tokenId) external view returns (string memory);
}
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
library Math {
error MathOverflowedMulDiv();
enum Rounding {
Floor,
Ceil,
Trunc,
Expand
}
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
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) {
if (b == 0) {
return a / b;
}
return a == 0 ? 0 : (a - 1) / b + 1;
}
function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
unchecked {
uint256 prod0 = x * y;
uint256 prod1;
assembly {
let mm := mulmod(x, y, not(0))
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
if (prod1 == 0) {
return prod0 / denominator;
}
if (denominator <= prod1) {
revert MathOverflowedMulDiv();
}
uint256 remainder;
assembly {
remainder := mulmod(x, y, denominator)
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
uint256 twos = denominator & (0 - denominator);
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 (unsignedRoundsUp(rounding) && 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 + (unsignedRoundsUp(rounding) && 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 + (unsignedRoundsUp(rounding) && 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 + (unsignedRoundsUp(rounding) && 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 + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);
}
}
function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
return uint8(rounding) % 2 == 1;
}
}
library SignedMath {
function max(int256 a, int256 b) internal pure returns (int256) {
return a > b ? a : b;
}
function min(int256 a, int256 b) internal pure returns (int256) {
return a < b ? a : b;
}
function average(int256 a, int256 b) internal pure returns (int256) {
int256 x = (a & b) + ((a ^ b) >> 1);
return x + (int256(uint256(x) >> 255) & (a ^ b));
}
function abs(int256 n) internal pure returns (uint256) {
unchecked {
return uint256(n >= 0 ? n : -n);
}
}
}
library Strings {
bytes16 private constant HEX_DIGITS = "0123456789abcdef";
uint8 private constant ADDRESS_LENGTH = 20;
error StringsInsufficientHexLength(uint256 value, uint256 length);
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), HEX_DIGITS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
function toStringSigned(int256 value) internal pure returns (string memory) {
return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value)));
}
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) {
uint256 localValue = value;
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] = HEX_DIGITS[localValue & 0xf];
localValue >>= 4;
}
if (localValue != 0) {
revert StringsInsufficientHexLength(value, length);
}
return string(buffer);
}
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);
}
function equal(string memory a, string memory b) internal pure returns (bool) {
return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));
}
}
abstract contract ERC165 is IERC165 {
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
interface IERC20Errors {
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
error ERC20InvalidSender(address sender);
error ERC20InvalidReceiver(address receiver);
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
error ERC20InvalidApprover(address approver);
error ERC20InvalidSpender(address spender);
}
interface IERC721Errors {
error ERC721InvalidOwner(address owner);
error ERC721NonexistentToken(uint256 tokenId);
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
error ERC721InvalidSender(address sender);
error ERC721InvalidReceiver(address receiver);
error ERC721InsufficientApproval(address operator, uint256 tokenId);
error ERC721InvalidApprover(address approver);
error ERC721InvalidOperator(address operator);
}
interface IERC1155Errors {
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
error ERC1155InvalidSender(address sender);
error ERC1155InvalidReceiver(address receiver);
error ERC1155MissingApprovalForAll(address operator, address owner);
error ERC1155InvalidApprover(address approver);
error ERC1155InvalidOperator(address operator);
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}
abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Errors {
using Strings for uint256;
string private _name;
string private _symbol;
mapping(uint256 tokenId => address) private _owners;
mapping(address owner => uint256) private _balances;
mapping(uint256 tokenId => address) private _tokenApprovals;
mapping(address owner => mapping(address operator => bool)) private _operatorApprovals;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
function balanceOf(address owner) public view virtual returns (uint256) {
if (owner == address(0)) {
revert ERC721InvalidOwner(address(0));
}
return _balances[owner];
}
function ownerOf(uint256 tokenId) public view virtual returns (address) {
return _requireOwned(tokenId);
}
function name() public view virtual returns (string memory) {
return _name;
}
function symbol() public view virtual returns (string memory) {
return _symbol;
}
function tokenURI(uint256 tokenId) public view virtual returns (string memory) {
_requireOwned(tokenId);
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string.concat(baseURI, tokenId.toString()) : "";
}
function _baseURI() internal view virtual returns (string memory) {
return "";
}
function approve(address to, uint256 tokenId) public virtual {
_approve(to, tokenId, _msgSender());
}
function getApproved(uint256 tokenId) public view virtual returns (address) {
_requireOwned(tokenId);
return _getApproved(tokenId);
}
function setApprovalForAll(address operator, bool approved) public virtual {
_setApprovalForAll(_msgSender(), operator, approved);
}
function isApprovedForAll(address owner, address operator) public view virtual returns (bool) {
return _operatorApprovals[owner][operator];
}
function transferFrom(address from, address to, uint256 tokenId) public virtual {
if (to == address(0)) {
revert ERC721InvalidReceiver(address(0));
}
address previousOwner = _update(to, tokenId, _msgSender());
if (previousOwner != from) {
revert ERC721IncorrectOwner(from, tokenId, previousOwner);
}
}
function safeTransferFrom(address from, address to, uint256 tokenId) public {
safeTransferFrom(from, to, tokenId, "");
}
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual {
transferFrom(from, to, tokenId);
_checkOnERC721Received(from, to, tokenId, data);
}
function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
return _owners[tokenId];
}
function _getApproved(uint256 tokenId) internal view virtual returns (address) {
return _tokenApprovals[tokenId];
}
function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) {
return
spender != address(0) &&
(owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender);
}
function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual {
if (!_isAuthorized(owner, spender, tokenId)) {
if (owner == address(0)) {
revert ERC721NonexistentToken(tokenId);
} else {
revert ERC721InsufficientApproval(spender, tokenId);
}
}
}
function _increaseBalance(address account, uint128 value) internal virtual {
unchecked {
_balances[account] += value;
}
}
function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) {
address from = _ownerOf(tokenId);
if (auth != address(0)) {
_checkAuthorized(from, auth, tokenId);
}
if (from != address(0)) {
_approve(address(0), tokenId, address(0), false);
unchecked {
_balances[from] -= 1;
}
}
if (to != address(0)) {
unchecked {
_balances[to] += 1;
}
}
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
return from;
}
function _mint(address to, uint256 tokenId) internal {
if (to == address(0)) {
revert ERC721InvalidReceiver(address(0));
}
address previousOwner = _update(to, tokenId, address(0));
if (previousOwner != address(0)) {
revert ERC721InvalidSender(address(0));
}
}
function _safeMint(address to, uint256 tokenId) internal {
_safeMint(to, tokenId, "");
}
function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {
_mint(to, tokenId);
_checkOnERC721Received(address(0), to, tokenId, data);
}
function _burn(uint256 tokenId) internal {
address previousOwner = _update(address(0), tokenId, address(0));
if (previousOwner == address(0)) {
revert ERC721NonexistentToken(tokenId);
}
}
function _transfer(address from, address to, uint256 tokenId) internal {
if (to == address(0)) {
revert ERC721InvalidReceiver(address(0));
}
address previousOwner = _update(to, tokenId, address(0));
if (previousOwner == address(0)) {
revert ERC721NonexistentToken(tokenId);
} else if (previousOwner != from) {
revert ERC721IncorrectOwner(from, tokenId, previousOwner);
}
}
function _safeTransfer(address from, address to, uint256 tokenId) internal {
_safeTransfer(from, to, tokenId, "");
}
function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {
_transfer(from, to, tokenId);
_checkOnERC721Received(from, to, tokenId, data);
}
function _approve(address to, uint256 tokenId, address auth) internal {
_approve(to, tokenId, auth, true);
}
function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual {
if (emitEvent || auth != address(0)) {
address owner = _requireOwned(tokenId);
if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) {
revert ERC721InvalidApprover(auth);
}
if (emitEvent) {
emit Approval(owner, to, tokenId);
}
}
_tokenApprovals[tokenId] = to;
}
function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {
if (operator == address(0)) {
revert ERC721InvalidOperator(operator);
}
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
function _requireOwned(uint256 tokenId) internal view returns (address) {
address owner = _ownerOf(tokenId);
if (owner == address(0)) {
revert ERC721NonexistentToken(tokenId);
}
return owner;
}
function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private {
if (to.code.length > 0) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
if (retval != IERC721Receiver.onERC721Received.selector) {
revert ERC721InvalidReceiver(to);
}
} catch (bytes memory reason) {
if (reason.length == 0) {
revert ERC721InvalidReceiver(to);
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
}
}
}
abstract contract Ownable is Context {
address private _owner;
error OwnableUnauthorizedAccount(address account);
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
interface IBoostSource {
function boostBps(address user) external view returns (uint256);
}
interface IFloorGameSync {
function syncBoost(address user) external;
}
/// Soulbound +2% Alpha badge for players who connect their X account to their wallet.
/// X linkage is verified off-chain (wallet signature + X OAuth) and stored in the
/// site's KV; the owner mirrors that set on-chain with ownerMint / ownerMintBatch, so
/// no signing key ever lives on a server. Registered as a BoostRegistry event source,
/// so the +2% stacks with other boosts under the game's total-boost cap. One per wallet.
contract XBoost is ERC721, Ownable, IBoostSource {
uint256 public constant X_BOOST_BPS = 200;
/// The game we poke so a fresh boost applies to mining immediately.
IFloorGameSync public game;
uint256 public nextTokenId = 1;
/// One token per wallet — lets the owner map a holder back to its tokenId to revoke.
mapping(address => uint256) public tokenOfHolder;
/// Single metadata document for every token. Owner-settable.
string public metadataURI;
event Granted(address indexed user, uint256 indexed tokenId);
event Revoked(address indexed user, uint256 indexed tokenId);
event GameSet(address indexed game);
event MetadataURISet(string uri);
error Soulbound();
error NotHeld();
constructor(address owner_, string memory metadataURI_)
ERC721("The Floor X Badge", "XFLOOR")
Ownable(owner_)
{
metadataURI = metadataURI_;
}
/// Grant the badge to one wallet that has linked X. No-op-safe: skips if already held.
function ownerMint(address to) external onlyOwner {
_grant(to);
}
/// Grant to many wallets at once (the admin "sync" path). Already-held wallets are
/// skipped, so re-running the full linked-wallet list is always safe and idempotent.
function ownerMintBatch(address[] calldata tos) external onlyOwner {
for (uint256 i = 0; i < tos.length; i++) {
_grant(tos[i]);
}
}
/// Owner escape hatch: remove a badge (e.g. if a wallet unlinks X).
function ownerRevoke(address holder) external onlyOwner {
if (balanceOf(holder) == 0) revert NotHeld();
uint256 tokenId = tokenOfHolder[holder];
_burn(tokenId);
emit Revoked(holder, tokenId);
_poke(holder);
}
function _grant(address to) private {
if (to == address(0) || balanceOf(to) != 0) return;
uint256 tokenId = nextTokenId++;
tokenOfHolder[to] = tokenId;
_safeMint(to, tokenId);
emit Granted(to, tokenId);
_poke(to);
}
function boostBps(address user) external view returns (uint256) {
return balanceOf(user) != 0 ? X_BOOST_BPS : 0;
}
function tokenURI(uint256 tokenId) public view override returns (string memory) {
_requireOwned(tokenId);
return metadataURI;
}
function setGame(address game_) external onlyOwner {
game = IFloorGameSync(game_);
emit GameSet(game_);
}
function setMetadataURI(string calldata uri) external onlyOwner {
metadataURI = uri;
emit MetadataURISet(uri);
}
function _update(address to, uint256 tokenId, address auth)
internal
override
returns (address)
{
address from = _ownerOf(tokenId);
if (from != address(0) && to != address(0)) revert Soulbound();
if (to == address(0) && from != address(0)) delete tokenOfHolder[from];
return super._update(to, tokenId, auth);
}
function _poke(address user) private {
IFloorGameSync g = game;
if (address(g) != address(0)) {
try g.syncBoost(user) {} catch {}
}
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "owner_",
"type": "address",
"internalType": "address"
},
{
"name": "metadataURI_",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "nonpayable"
},
{
"name": "ERC721IncorrectOwner",
"type": "error",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC721InsufficientApproval",
"type": "error",
"inputs": [
{
"name": "operator",
"type": "address",
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC721InvalidApprover",
"type": "error",
"inputs": [
{
"name": "approver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC721InvalidOperator",
"type": "error",
"inputs": [
{
"name": "operator",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC721InvalidOwner",
"type": "error",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC721InvalidReceiver",
"type": "error",
"inputs": [
{
"name": "receiver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC721InvalidSender",
"type": "error",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC721NonexistentToken",
"type": "error",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "NotHeld",
"type": "error",
"inputs": []
},
{
"name": "OwnableInvalidOwner",
"type": "error",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "OwnableUnauthorizedAccount",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "Soulbound",
"type": "error",
"inputs": []
},
{
"name": "Approval",
"type": "event",
"inputs": [
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "approved",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "ApprovalForAll",
"type": "event",
"inputs": [
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "operator",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "approved",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "GameSet",
"type": "event",
"inputs": [
{
"name": "game",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Granted",
"type": "event",
"inputs": [
{
"name": "user",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "MetadataURISet",
"type": "event",
"inputs": [
{
"name": "uri",
"type": "string",
"indexed": false,
"internalType": "string"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Revoked",
"type": "event",
"inputs": [
{
"name": "user",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Transfer",
"type": "event",
"inputs": [
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "X_BOOST_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "approve",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "balanceOf",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "boostBps",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "game",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IFloorGameSync"
}
],
"stateMutability": "view"
},
{
"name": "getApproved",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "isApprovedForAll",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
},
{
"name": "operator",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "metadataURI",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "name",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "nextTokenId",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "ownerMint",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "ownerMintBatch",
"type": "function",
"inputs": [
{
"name": "tos",
"type": "address[]",
"internalType": "address[]"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "ownerOf",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "ownerRevoke",
"type": "function",
"inputs": [
{
"name": "holder",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "safeTransferFrom",
"type": "function",
"inputs": [
{
"name": "from",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "safeTransferFrom",
"type": "function",
"inputs": [
{
"name": "from",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "data",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setApprovalForAll",
"type": "function",
"inputs": [
{
"name": "operator",
"type": "address",
"internalType": "address"
},
{
"name": "approved",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setGame",
"type": "function",
"inputs": [
{
"name": "game_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setMetadataURI",
"type": "function",
"inputs": [
{
"name": "uri",
"type": "string",
"internalType": "string"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "supportsInterface",
"type": "function",
"inputs": [
{
"name": "interfaceId",
"type": "bytes4",
"internalType": "bytes4"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "symbol",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "tokenOfHolder",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "tokenURI",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "transferFrom",
"type": "function",
"inputs": [
{
"name": "from",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
}
]0x60806040526001600855348015610014575f5ffd5b506040516119fc3803806119fc8339810160408190526100339161014b565b816040518060400160405280601181526020017054686520466c6f6f72205820426164676560781b815250604051806040016040528060068152602001652c232627a7a960d11b815250815f908161008b91906102a9565b50600161009882826102a9565b5050506001600160a01b0381166100c857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100d1816100e6565b50600a6100de82826102a9565b505050610367565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b634e487b7160e01b5f52604160045260245ffd5b5f5f6040838503121561015c575f5ffd5b82516001600160a01b0381168114610172575f5ffd5b60208401519092506001600160401b0381111561018d575f5ffd5b8301601f8101851361019d575f5ffd5b80516001600160401b038111156101b6576101b6610137565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101e4576101e4610137565b6040528181528282016020018710156101fb575f5ffd5b8160208401602083015e5f602083830101528093505050509250929050565b600181811c9082168061022e57607f821691505b60208210810361024c57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156102a457828211156102a457805f5260205f20601f840160051c602085101561027d57505f5b90810190601f840160051c035f5b818110156102a0575f8382015560010161028b565b5050505b505050565b81516001600160401b038111156102c2576102c2610137565b6102d6816102d0845461021a565b84610252565b6020601f821160018114610308575f83156102f15750848201515b5f19600385901b1c1916600184901b178455610360565b5f84815260208120601f198516915b828110156103375787850151825560209485019460019092019101610317565b508482101561035457868401515f19600387901b60f8161c191681555b505060018360011b0184555b5050505050565b611688806103745f395ff3fe608060405234801561000f575f5ffd5b50600436106101a1575f3560e01c8063715018a6116100f3578063b88d4fde11610093578063c87b56dd1161006e578063c87b56dd14610361578063e985e9c514610374578063f294d9ce14610387578063f2fde38b146103a6575f5ffd5b8063b88d4fde14610333578063c3fe3e2814610346578063c780b56214610359575f5ffd5b8063819912a2116100ce578063819912a2146102f45780638da5cb5b1461030757806395d89b4114610318578063a22cb46514610320575f5ffd5b8063715018a6146102d0578063750521f5146102d857806375794a3c146102eb575f5ffd5b80631e3bcc8e1161015e57806356ea45ed1161013957806356ea45ed146102845780636352211e146102975780636e67a3a1146102aa57806370a08231146102bd575f5ffd5b80631e3bcc8e1461024b57806323b872dd1461025e57806342842e0e14610271575f5ffd5b806301ffc9a7146101a557806303ee438c146101cd57806306fdde03146101e2578063081812fc146101ea578063095ea7b314610215578063123e2a8d1461022a575b5f5ffd5b6101b86101b3366004611114565b6103b9565b60405190151581526020015b60405180910390f35b6101d561040a565b6040516101c49190611164565b6101d5610496565b6101fd6101f8366004611176565b610525565b6040516001600160a01b0390911681526020016101c4565b6102286102233660046111a8565b61054c565b005b61023d6102383660046111d0565b61055b565b6040519081526020016101c4565b6102286102593660046111d0565b610579565b61022861026c3660046111e9565b61058d565b61022861027f3660046111e9565b61061b565b6102286102923660046111d0565b61063a565b6101fd6102a5366004611176565b6106c9565b6102286102b8366004611223565b6106d3565b61023d6102cb3660046111d0565b61071c565b610228610761565b6102286102e6366004611294565b610774565b61023d60085481565b6102286103023660046111d0565b6107c7565b6006546001600160a01b03166101fd565b6101d5610818565b61022861032e3660046112f2565b610827565b61022861034136600461133f565b610832565b6007546101fd906001600160a01b031681565b61023d60c881565b6101d561036f366004611176565b610849565b6101b861038236600461141c565b6108e5565b61023d6103953660046111d0565b60096020525f908152604090205481565b6102286103b43660046111d0565b610912565b5f6001600160e01b031982166380ac58cd60e01b14806103e957506001600160e01b03198216635b5e139f60e01b145b8061040457506301ffc9a760e01b6001600160e01b03198316145b92915050565b600a80546104179061144d565b80601f01602080910402602001604051908101604052809291908181526020018280546104439061144d565b801561048e5780601f106104655761010080835404028352916020019161048e565b820191905f5260205f20905b81548152906001019060200180831161047157829003601f168201915b505050505081565b60605f80546104a49061144d565b80601f01602080910402602001604051908101604052809291908181526020018280546104d09061144d565b801561051b5780601f106104f25761010080835404028352916020019161051b565b820191905f5260205f20905b8154815290600101906020018083116104fe57829003601f168201915b5050505050905090565b5f61052f8261094c565b505f828152600460205260409020546001600160a01b0316610404565b610557828233610984565b5050565b5f6105658261071c565b5f03610571575f610404565b60c892915050565b610581610991565b61058a816109be565b50565b6001600160a01b0382166105bb57604051633250574960e11b81525f60048201526024015b60405180910390fd5b5f6105c7838333610a5b565b9050836001600160a01b0316816001600160a01b031614610615576040516364283d7b60e01b81526001600160a01b03808616600483015260248201849052821660448201526064016105b2565b50505050565b61063583838360405180602001604052805f815250610832565b505050565b610642610991565b61064b8161071c565b5f0361066a5760405163845eadf160e01b815260040160405180910390fd5b6001600160a01b0381165f9081526009602052604090205461068b81610af8565b60405181906001600160a01b038416907f713b90881ad62c4fa8ab6bd9197fa86481fc0c11b2edba60026514281b2dbac4905f90a361055782610b30565b5f6104048261094c565b6106db610991565b5f5b81811015610635576107148383838181106106fa576106fa611485565b905060200201602081019061070f91906111d0565b6109be565b6001016106dd565b5f6001600160a01b038216610746576040516322718ad960e21b81525f60048201526024016105b2565b506001600160a01b03165f9081526003602052604090205490565b610769610991565b6107725f610b9c565b565b61077c610991565b600a6107898284836114ef565b507f307edb14d46e43e3a7232886d692798e4129f8bb711ca4ce6cf43e2c55fc8e9682826040516107bb9291906115a9565b60405180910390a15050565b6107cf610991565b600780546001600160a01b0319166001600160a01b0383169081179091556040517f0f00b30b35f86bb5e8c20059b4c21fc6d657e22aa8f46044286751f6b8120443905f90a250565b6060600180546104a49061144d565b610557338383610bed565b61083d84848461058d565b61061584848484610c8b565b60606108548261094c565b50600a80546108629061144d565b80601f016020809104026020016040519081016040528092919081815260200182805461088e9061144d565b80156108d95780601f106108b0576101008083540402835291602001916108d9565b820191905f5260205f20905b8154815290600101906020018083116108bc57829003601f168201915b50505050509050919050565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b61091a610991565b6001600160a01b03811661094357604051631e4fbdf760e01b81525f60048201526024016105b2565b61058a81610b9c565b5f818152600260205260408120546001600160a01b03168061040457604051637e27328960e01b8152600481018490526024016105b2565b6106358383836001610db1565b6006546001600160a01b031633146107725760405163118cdaa760e01b81523360048201526024016105b2565b6001600160a01b03811615806109db57506109d88161071c565b15155b156109e35750565b600880545f91826109f3836115d7565b909155506001600160a01b0383165f9081526009602052604090208190559050610a1d8282610eb5565b60405181906001600160a01b038416907f640e37a8f90a1d221d5cd8176ab4eb9bc1bd82ce5616399aca28e613ecf22da4905f90a361055782610b30565b5f828152600260205260408120546001600160a01b03168015801590610a8957506001600160a01b03851615155b15610aa75760405163a4420a9560e01b815260040160405180910390fd5b6001600160a01b038516158015610ac657506001600160a01b03811615155b15610ae4576001600160a01b0381165f908152600960205260408120555b610aef858585610ece565b95945050505050565b5f610b045f835f610a5b565b90506001600160a01b03811661055757604051637e27328960e01b8152600481018390526024016105b2565b6007546001600160a01b03168015610557576040516321194be360e11b81526001600160a01b03838116600483015282169063423297c6906024015f604051808303815f87803b158015610b82575f5ffd5b505af1925050508015610b93575060015b15610557575050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b038216610c1f57604051630b61174360e31b81526001600160a01b03831660048201526024016105b2565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b1561061557604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290610ccd9033908890879087906004016115fb565b6020604051808303815f875af1925050508015610d07575060408051601f3d908101601f19168201909252610d0491810190611637565b60015b610d6e573d808015610d34576040519150601f19603f3d011682016040523d82523d5f602084013e610d39565b606091505b5080515f03610d6657604051633250574960e11b81526001600160a01b03851660048201526024016105b2565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b14610daa57604051633250574960e11b81526001600160a01b03851660048201526024016105b2565b5050505050565b8080610dc557506001600160a01b03821615155b15610e86575f610dd48461094c565b90506001600160a01b03831615801590610e005750826001600160a01b0316816001600160a01b031614155b8015610e135750610e1181846108e5565b155b15610e3c5760405163a9fbf51f60e01b81526001600160a01b03841660048201526024016105b2565b8115610e845783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b50505f90815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b610557828260405180602001604052805f815250610fc0565b5f828152600260205260408120546001600160a01b0390811690831615610efa57610efa818486610fd6565b6001600160a01b03811615610f3457610f155f855f5f610db1565b6001600160a01b0381165f90815260036020526040902080545f190190555b6001600160a01b03851615610f62576001600160a01b0385165f908152600360205260409020805460010190555b5f8481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b610fca838361103a565b6106355f848484610c8b565b610fe183838361109b565b610635576001600160a01b03831661100f57604051637e27328960e01b8152600481018290526024016105b2565b60405163177e802f60e01b81526001600160a01b0383166004820152602481018290526044016105b2565b6001600160a01b03821661106357604051633250574960e11b81525f60048201526024016105b2565b5f61106f83835f610a5b565b90506001600160a01b03811615610635576040516339e3563760e11b81525f60048201526024016105b2565b5f6001600160a01b038316158015906110f75750826001600160a01b0316846001600160a01b031614806110d457506110d484846108e5565b806110f757505f828152600460205260409020546001600160a01b038481169116145b949350505050565b6001600160e01b03198116811461058a575f5ffd5b5f60208284031215611124575f5ffd5b813561112f816110ff565b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61112f6020830184611136565b5f60208284031215611186575f5ffd5b5035919050565b80356001600160a01b03811681146111a3575f5ffd5b919050565b5f5f604083850312156111b9575f5ffd5b6111c28361118d565b946020939093013593505050565b5f602082840312156111e0575f5ffd5b61112f8261118d565b5f5f5f606084860312156111fb575f5ffd5b6112048461118d565b92506112126020850161118d565b929592945050506040919091013590565b5f5f60208385031215611234575f5ffd5b823567ffffffffffffffff81111561124a575f5ffd5b8301601f8101851361125a575f5ffd5b803567ffffffffffffffff811115611270575f5ffd5b8560208260051b8401011115611284575f5ffd5b6020919091019590945092505050565b5f5f602083850312156112a5575f5ffd5b823567ffffffffffffffff8111156112bb575f5ffd5b8301601f810185136112cb575f5ffd5b803567ffffffffffffffff8111156112e1575f5ffd5b856020828401011115611284575f5ffd5b5f5f60408385031215611303575f5ffd5b61130c8361118d565b915060208301358015158114611320575f5ffd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f60808587031215611352575f5ffd5b61135b8561118d565b93506113696020860161118d565b925060408501359150606085013567ffffffffffffffff81111561138b575f5ffd5b8501601f8101871361139b575f5ffd5b803567ffffffffffffffff8111156113b5576113b561132b565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156113e4576113e461132b565b6040528181528282016020018910156113fb575f5ffd5b816020840160208301375f6020838301015280935050505092959194509250565b5f5f6040838503121561142d575f5ffd5b6114368361118d565b91506114446020840161118d565b90509250929050565b600181811c9082168061146157607f821691505b60208210810361147f57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b601f821115610635578282111561063557805f5260205f20601f840160051c60208510156114c457505f5b90810190601f840160051c035f5b818110156114e7575f838201556001016114d2565b505050505050565b67ffffffffffffffff8311156115075761150761132b565b61151b83611515835461144d565b83611499565b5f601f84116001811461154c575f85156115355750838201355b5f19600387901b1c1916600186901b178355610daa565b5f83815260208120601f198716915b8281101561157b578685013582556020948501946001909201910161155b565b5086821015611597575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f600182016115f457634e487b7160e01b5f52601160045260245ffd5b5060010190565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061162d90830184611136565b9695505050505050565b5f60208284031215611647575f5ffd5b815161112f816110ff56fea2646970667358221220225d210f0372eba75109f3a2cda0f4f9ef9429273fdefa70847e8e953d99156c64736f6c6343000822003300000000000000000000000044d1bb5f85b83e26156a5c060f1232ecab0a33d90000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002a68747470733a2f2f746865666c6f6f722e73682f6173736574732f7362742d78626f6f73742e6a736f6e00000000000000000000000000000000000000000000
0x608060405234801561000f575f5ffd5b50600436106101a1575f3560e01c8063715018a6116100f3578063b88d4fde11610093578063c87b56dd1161006e578063c87b56dd14610361578063e985e9c514610374578063f294d9ce14610387578063f2fde38b146103a6575f5ffd5b8063b88d4fde14610333578063c3fe3e2814610346578063c780b56214610359575f5ffd5b8063819912a2116100ce578063819912a2146102f45780638da5cb5b1461030757806395d89b4114610318578063a22cb46514610320575f5ffd5b8063715018a6146102d0578063750521f5146102d857806375794a3c146102eb575f5ffd5b80631e3bcc8e1161015e57806356ea45ed1161013957806356ea45ed146102845780636352211e146102975780636e67a3a1146102aa57806370a08231146102bd575f5ffd5b80631e3bcc8e1461024b57806323b872dd1461025e57806342842e0e14610271575f5ffd5b806301ffc9a7146101a557806303ee438c146101cd57806306fdde03146101e2578063081812fc146101ea578063095ea7b314610215578063123e2a8d1461022a575b5f5ffd5b6101b86101b3366004611114565b6103b9565b60405190151581526020015b60405180910390f35b6101d561040a565b6040516101c49190611164565b6101d5610496565b6101fd6101f8366004611176565b610525565b6040516001600160a01b0390911681526020016101c4565b6102286102233660046111a8565b61054c565b005b61023d6102383660046111d0565b61055b565b6040519081526020016101c4565b6102286102593660046111d0565b610579565b61022861026c3660046111e9565b61058d565b61022861027f3660046111e9565b61061b565b6102286102923660046111d0565b61063a565b6101fd6102a5366004611176565b6106c9565b6102286102b8366004611223565b6106d3565b61023d6102cb3660046111d0565b61071c565b610228610761565b6102286102e6366004611294565b610774565b61023d60085481565b6102286103023660046111d0565b6107c7565b6006546001600160a01b03166101fd565b6101d5610818565b61022861032e3660046112f2565b610827565b61022861034136600461133f565b610832565b6007546101fd906001600160a01b031681565b61023d60c881565b6101d561036f366004611176565b610849565b6101b861038236600461141c565b6108e5565b61023d6103953660046111d0565b60096020525f908152604090205481565b6102286103b43660046111d0565b610912565b5f6001600160e01b031982166380ac58cd60e01b14806103e957506001600160e01b03198216635b5e139f60e01b145b8061040457506301ffc9a760e01b6001600160e01b03198316145b92915050565b600a80546104179061144d565b80601f01602080910402602001604051908101604052809291908181526020018280546104439061144d565b801561048e5780601f106104655761010080835404028352916020019161048e565b820191905f5260205f20905b81548152906001019060200180831161047157829003601f168201915b505050505081565b60605f80546104a49061144d565b80601f01602080910402602001604051908101604052809291908181526020018280546104d09061144d565b801561051b5780601f106104f25761010080835404028352916020019161051b565b820191905f5260205f20905b8154815290600101906020018083116104fe57829003601f168201915b5050505050905090565b5f61052f8261094c565b505f828152600460205260409020546001600160a01b0316610404565b610557828233610984565b5050565b5f6105658261071c565b5f03610571575f610404565b60c892915050565b610581610991565b61058a816109be565b50565b6001600160a01b0382166105bb57604051633250574960e11b81525f60048201526024015b60405180910390fd5b5f6105c7838333610a5b565b9050836001600160a01b0316816001600160a01b031614610615576040516364283d7b60e01b81526001600160a01b03808616600483015260248201849052821660448201526064016105b2565b50505050565b61063583838360405180602001604052805f815250610832565b505050565b610642610991565b61064b8161071c565b5f0361066a5760405163845eadf160e01b815260040160405180910390fd5b6001600160a01b0381165f9081526009602052604090205461068b81610af8565b60405181906001600160a01b038416907f713b90881ad62c4fa8ab6bd9197fa86481fc0c11b2edba60026514281b2dbac4905f90a361055782610b30565b5f6104048261094c565b6106db610991565b5f5b81811015610635576107148383838181106106fa576106fa611485565b905060200201602081019061070f91906111d0565b6109be565b6001016106dd565b5f6001600160a01b038216610746576040516322718ad960e21b81525f60048201526024016105b2565b506001600160a01b03165f9081526003602052604090205490565b610769610991565b6107725f610b9c565b565b61077c610991565b600a6107898284836114ef565b507f307edb14d46e43e3a7232886d692798e4129f8bb711ca4ce6cf43e2c55fc8e9682826040516107bb9291906115a9565b60405180910390a15050565b6107cf610991565b600780546001600160a01b0319166001600160a01b0383169081179091556040517f0f00b30b35f86bb5e8c20059b4c21fc6d657e22aa8f46044286751f6b8120443905f90a250565b6060600180546104a49061144d565b610557338383610bed565b61083d84848461058d565b61061584848484610c8b565b60606108548261094c565b50600a80546108629061144d565b80601f016020809104026020016040519081016040528092919081815260200182805461088e9061144d565b80156108d95780601f106108b0576101008083540402835291602001916108d9565b820191905f5260205f20905b8154815290600101906020018083116108bc57829003601f168201915b50505050509050919050565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b61091a610991565b6001600160a01b03811661094357604051631e4fbdf760e01b81525f60048201526024016105b2565b61058a81610b9c565b5f818152600260205260408120546001600160a01b03168061040457604051637e27328960e01b8152600481018490526024016105b2565b6106358383836001610db1565b6006546001600160a01b031633146107725760405163118cdaa760e01b81523360048201526024016105b2565b6001600160a01b03811615806109db57506109d88161071c565b15155b156109e35750565b600880545f91826109f3836115d7565b909155506001600160a01b0383165f9081526009602052604090208190559050610a1d8282610eb5565b60405181906001600160a01b038416907f640e37a8f90a1d221d5cd8176ab4eb9bc1bd82ce5616399aca28e613ecf22da4905f90a361055782610b30565b5f828152600260205260408120546001600160a01b03168015801590610a8957506001600160a01b03851615155b15610aa75760405163a4420a9560e01b815260040160405180910390fd5b6001600160a01b038516158015610ac657506001600160a01b03811615155b15610ae4576001600160a01b0381165f908152600960205260408120555b610aef858585610ece565b95945050505050565b5f610b045f835f610a5b565b90506001600160a01b03811661055757604051637e27328960e01b8152600481018390526024016105b2565b6007546001600160a01b03168015610557576040516321194be360e11b81526001600160a01b03838116600483015282169063423297c6906024015f604051808303815f87803b158015610b82575f5ffd5b505af1925050508015610b93575060015b15610557575050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b038216610c1f57604051630b61174360e31b81526001600160a01b03831660048201526024016105b2565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b1561061557604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290610ccd9033908890879087906004016115fb565b6020604051808303815f875af1925050508015610d07575060408051601f3d908101601f19168201909252610d0491810190611637565b60015b610d6e573d808015610d34576040519150601f19603f3d011682016040523d82523d5f602084013e610d39565b606091505b5080515f03610d6657604051633250574960e11b81526001600160a01b03851660048201526024016105b2565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b14610daa57604051633250574960e11b81526001600160a01b03851660048201526024016105b2565b5050505050565b8080610dc557506001600160a01b03821615155b15610e86575f610dd48461094c565b90506001600160a01b03831615801590610e005750826001600160a01b0316816001600160a01b031614155b8015610e135750610e1181846108e5565b155b15610e3c5760405163a9fbf51f60e01b81526001600160a01b03841660048201526024016105b2565b8115610e845783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b50505f90815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b610557828260405180602001604052805f815250610fc0565b5f828152600260205260408120546001600160a01b0390811690831615610efa57610efa818486610fd6565b6001600160a01b03811615610f3457610f155f855f5f610db1565b6001600160a01b0381165f90815260036020526040902080545f190190555b6001600160a01b03851615610f62576001600160a01b0385165f908152600360205260409020805460010190555b5f8481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b610fca838361103a565b6106355f848484610c8b565b610fe183838361109b565b610635576001600160a01b03831661100f57604051637e27328960e01b8152600481018290526024016105b2565b60405163177e802f60e01b81526001600160a01b0383166004820152602481018290526044016105b2565b6001600160a01b03821661106357604051633250574960e11b81525f60048201526024016105b2565b5f61106f83835f610a5b565b90506001600160a01b03811615610635576040516339e3563760e11b81525f60048201526024016105b2565b5f6001600160a01b038316158015906110f75750826001600160a01b0316846001600160a01b031614806110d457506110d484846108e5565b806110f757505f828152600460205260409020546001600160a01b038481169116145b949350505050565b6001600160e01b03198116811461058a575f5ffd5b5f60208284031215611124575f5ffd5b813561112f816110ff565b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61112f6020830184611136565b5f60208284031215611186575f5ffd5b5035919050565b80356001600160a01b03811681146111a3575f5ffd5b919050565b5f5f604083850312156111b9575f5ffd5b6111c28361118d565b946020939093013593505050565b5f602082840312156111e0575f5ffd5b61112f8261118d565b5f5f5f606084860312156111fb575f5ffd5b6112048461118d565b92506112126020850161118d565b929592945050506040919091013590565b5f5f60208385031215611234575f5ffd5b823567ffffffffffffffff81111561124a575f5ffd5b8301601f8101851361125a575f5ffd5b803567ffffffffffffffff811115611270575f5ffd5b8560208260051b8401011115611284575f5ffd5b6020919091019590945092505050565b5f5f602083850312156112a5575f5ffd5b823567ffffffffffffffff8111156112bb575f5ffd5b8301601f810185136112cb575f5ffd5b803567ffffffffffffffff8111156112e1575f5ffd5b856020828401011115611284575f5ffd5b5f5f60408385031215611303575f5ffd5b61130c8361118d565b915060208301358015158114611320575f5ffd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f60808587031215611352575f5ffd5b61135b8561118d565b93506113696020860161118d565b925060408501359150606085013567ffffffffffffffff81111561138b575f5ffd5b8501601f8101871361139b575f5ffd5b803567ffffffffffffffff8111156113b5576113b561132b565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156113e4576113e461132b565b6040528181528282016020018910156113fb575f5ffd5b816020840160208301375f6020838301015280935050505092959194509250565b5f5f6040838503121561142d575f5ffd5b6114368361118d565b91506114446020840161118d565b90509250929050565b600181811c9082168061146157607f821691505b60208210810361147f57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b601f821115610635578282111561063557805f5260205f20601f840160051c60208510156114c457505f5b90810190601f840160051c035f5b818110156114e7575f838201556001016114d2565b505050505050565b67ffffffffffffffff8311156115075761150761132b565b61151b83611515835461144d565b83611499565b5f601f84116001811461154c575f85156115355750838201355b5f19600387901b1c1916600186901b178355610daa565b5f83815260208120601f198716915b8281101561157b578685013582556020948501946001909201910161155b565b5086821015611597575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f600182016115f457634e487b7160e01b5f52601160045260245ffd5b5060010190565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061162d90830184611136565b9695505050505050565b5f60208284031215611647575f5ffd5b815161112f816110ff56fea2646970667358221220225d210f0372eba75109f3a2cda0f4f9ef9429273fdefa70847e8e953d99156c64736f6c63430008220033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| DIH | 1 | $0.0000123 | $0 |
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x77be784e…c417d8 | Transfer | 18,566,622 | 21 days agoSat, 25 Jul 2026 00:06:15 UTC | 0xcaf7…5d11 | IN | 0xa15e…0520 | $0.001 DIH |
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x101e26…647d28 | 13 days agoSun, 02 Aug 2026 02:53:04 UTC | 0x640e37…2da4 | [0] 0x000000000000…afaa6521 [1] 0x000000000000…000000d6 |
| 0x101e26…647d28 | 13 days agoSun, 02 Aug 2026 02:53:04 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…afaa6521 [2] 0x000000000000…000000d6 |
| 0x4699c9…10d196 | 16 days agoThu, 30 Jul 2026 06:15:15 UTC | 0x640e37…2da4 | [0] 0x000000000000…60774ed3 [1] 0x000000000000…000000d5 |
| 0x4699c9…10d196 | 16 days agoThu, 30 Jul 2026 06:15:15 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…60774ed3 [2] 0x000000000000…000000d5 |
| 0x4699c9…10d196 | 16 days agoThu, 30 Jul 2026 06:15:15 UTC | 0x640e37…2da4 | [0] 0x000000000000…829a234b [1] 0x000000000000…000000d4 |
| 0x4699c9…10d196 | 16 days agoThu, 30 Jul 2026 06:15:15 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…829a234b [2] 0x000000000000…000000d4 |
| 0x4699c9…10d196 | 16 days agoThu, 30 Jul 2026 06:15:15 UTC | 0x640e37…2da4 | [0] 0x000000000000…fff47e98 [1] 0x000000000000…000000d3 |
| 0x4699c9…10d196 | 16 days agoThu, 30 Jul 2026 06:15:15 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…fff47e98 [2] 0x000000000000…000000d3 |
| 0x4699c9…10d196 | 16 days agoThu, 30 Jul 2026 06:15:15 UTC | 0x640e37…2da4 | [0] 0x000000000000…3ff6553b [1] 0x000000000000…000000d2 |
| 0x4699c9…10d196 | 16 days agoThu, 30 Jul 2026 06:15:15 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…3ff6553b [2] 0x000000000000…000000d2 |
| 0x4699c9…10d196 | 16 days agoThu, 30 Jul 2026 06:15:15 UTC | 0x640e37…2da4 | [0] 0x000000000000…56c1b3ec [1] 0x000000000000…000000d1 |
| 0x4699c9…10d196 | 16 days agoThu, 30 Jul 2026 06:15:15 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…56c1b3ec [2] 0x000000000000…000000d1 |
| 0x4699c9…10d196 | 16 days agoThu, 30 Jul 2026 06:15:15 UTC | 0x640e37…2da4 | [0] 0x000000000000…9e176737 [1] 0x000000000000…000000d0 |
| 0x4699c9…10d196 | 16 days agoThu, 30 Jul 2026 06:15:15 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…9e176737 [2] 0x000000000000…000000d0 |
| 0x4699c9…10d196 | 16 days agoThu, 30 Jul 2026 06:15:15 UTC | 0x640e37…2da4 | [0] 0x000000000000…0f7c7333 [1] 0x000000000000…000000cf |
| 0x4699c9…10d196 | 16 days agoThu, 30 Jul 2026 06:15:15 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…0f7c7333 [2] 0x000000000000…000000cf |
| 0x2cd83f…b088f2 | 21 days agoSat, 25 Jul 2026 17:05:55 UTC | 0x640e37…2da4 | [0] 0x000000000000…0eaf8c6e [1] 0x000000000000…000000ce |
| 0x2cd83f…b088f2 | 21 days agoSat, 25 Jul 2026 17:05:55 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…0eaf8c6e [2] 0x000000000000…000000ce |
| 0x2cd83f…b088f2 | 21 days agoSat, 25 Jul 2026 17:05:55 UTC | 0x640e37…2da4 | [0] 0x000000000000…0d4446f8 [1] 0x000000000000…000000cd |
| 0x2cd83f…b088f2 | 21 days agoSat, 25 Jul 2026 17:05:55 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…0d4446f8 [2] 0x000000000000…000000cd |
| 0x2cd83f…b088f2 | 21 days agoSat, 25 Jul 2026 17:05:55 UTC | 0x640e37…2da4 | [0] 0x000000000000…e7a9f8b1 [1] 0x000000000000…000000cc |
| 0x2cd83f…b088f2 | 21 days agoSat, 25 Jul 2026 17:05:55 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…e7a9f8b1 [2] 0x000000000000…000000cc |
| 0x2cd83f…b088f2 | 21 days agoSat, 25 Jul 2026 17:05:55 UTC | 0x640e37…2da4 | [0] 0x000000000000…7c2729f7 [1] 0x000000000000…000000cb |
| 0x2cd83f…b088f2 | 21 days agoSat, 25 Jul 2026 17:05:55 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…7c2729f7 [2] 0x000000000000…000000cb |
| 0x2cd83f…b088f2 | 21 days agoSat, 25 Jul 2026 17:05:55 UTC | 0x640e37…2da4 | [0] 0x000000000000…cec27c8f [1] 0x000000000000…000000ca |
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| no internal transactions found for this address yet (traced blocks + on-demand) | ||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x101e26…647d28 | ownerMintBatch | 25,556,492 | 13 days agoSun, 02 Aug 2026 02:53:04 UTC | 0x44d1…33d9 | IN | The Floor X Badge | $0.000 ETH | 0.00000235 | |
| 0x4699c9…10d196 | ownerMintBatch | 23,092,238 | 16 days agoThu, 30 Jul 2026 06:15:15 UTC | 0x44d1…33d9 | IN | The Floor X Badge | $0.000 ETH | 0.00001786 | |
| 0x2cd83f…b088f2 | ownerMintBatch | 19,175,702 | 21 days agoSat, 25 Jul 2026 17:05:55 UTC | 0x44d1…33d9 | IN | The Floor X Badge | $0.000 ETH | 0.00006749 | |
| 0xd1ce3d…8d65af | ownerMintBatch | 16,023,299 | 24 days agoWed, 22 Jul 2026 01:16:36 UTC | 0x44d1…33d9 | IN | The Floor X Badge | $0.000 ETH | 0.00010201 | |
| 0x37ff3b…5f55e4 | ownerMintBatch | 14,962,914 | 26 days agoMon, 20 Jul 2026 19:45:39 UTC | 0x44d1…33d9 | IN | The Floor X Badge | $0.000 ETH | 0.00017805 | |
| 0x97ece2…cdeb43 | ownerMintBatch | 13,231,926 | 28 days agoSat, 18 Jul 2026 19:29:15 UTC | 0x44d1…33d9 | IN | The Floor X Badge | $0.000 ETH | 0.00012243 | |
| 0x4428c9…50735b | ownerMintBatch | 11,004,932 | 30 days agoThu, 16 Jul 2026 05:27:25 UTC | 0x44d1…33d9 | IN | The Floor X Badge | $0.000 ETH | 0.00001410 | |
| 0x982958…d0454a | ownerMintBatch | 10,645,682 | 31 days agoWed, 15 Jul 2026 19:28:11 UTC | 0x44d1…33d9 | IN | The Floor X Badge | $0.000 ETH | 0.00002563 | |
| 0x4edc72…cf3434 | ownerMintBatch | 10,030,824 | 31 days agoWed, 15 Jul 2026 02:25:13 UTC | 0x44d1…33d9 | IN | The Floor X Badge | $0.000 ETH | 0.00005879 | |
| 0xdd29dd…ff57b2 | ownerMintBatch | 9,262,806 | 32 days agoTue, 14 Jul 2026 05:03:17 UTC | 0x44d1…33d9 | IN | The Floor X Badge | $0.000 ETH | 0.00003007 | |
| 0xd540d9…5c7ba8 | ownerMintBatch | 9,098,073 | 32 days agoTue, 14 Jul 2026 00:27:48 UTC | 0x44d1…33d9 | IN | The Floor X Badge | $0.000 ETH | 0.00002531 | |
| 0xb58625…495d5e | ownerMintBatch | 8,859,024 | 33 days agoMon, 13 Jul 2026 17:48:24 UTC | 0x44d1…33d9 | IN | The Floor X Badge | $0.000 ETH | 0.00015090 | |
| 0xcff876…25ea8f | Set Approval For All | 7,466,943 | 34 days agoSun, 12 Jul 2026 03:03:21 UTC | 0x2015…8a52 | IN | The Floor X Badge | $0.000 ETH | 0.00000267 | |
| 0x9f1d8e…9c42a8 | ownerMintBatch | 7,349,932 | 34 days agoSat, 11 Jul 2026 23:47:50 UTC | 0x44d1…33d9 | IN | The Floor X Badge | $0.000 ETH | 0.00014961 | |
| 0x04c733…5acc2d | ownerMintBatch | 7,143,701 | 35 days agoSat, 11 Jul 2026 18:03:37 UTC | 0x44d1…33d9 | IN | The Floor X Badge | $0.000 ETH | 0.00058521 | |
| 0xcbdb76…807334 | setGame | 7,137,344 | 35 days agoSat, 11 Jul 2026 17:53:00 UTC | 0x44d1…33d9 | IN | The Floor X Badge | $0.000 ETH | 0.00000283 |