| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";
import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
/// @title MirrorNFT
/// @notice ERC-721 mirror of a Collector Crypt card held in our Solana custody wallet.
/// One mirror <-> one custodied Solana NFT, always. Minting is operator-gated and
/// one-per-order; burning happens on sell-back (operator, after payout) or on
/// unwrap (token owner, redeeming the real Solana NFT).
/// @dev Doc 03 §2. Transfers are deliberately ENABLED — mirrors are tradeable and the
/// buyback right follows the current owner. Windows do NOT reset on transfer.
contract MirrorNFT is ERC721, Ownable, EIP712, ReentrancyGuard {
using SafeERC20 for IERC20;
/// @param solanaMintHash keccak256 of the base58 mint address (full string in tokenURI)
/// @param ccOpenTxHash keccak256 of the CC pack-open Solana signature (order binding)
/// @param revealAt block time of reveal; starts both windows
/// @param userWindowEndsAt reveal + 66h. Sell-backs allowed until here (enforced
/// off-chain; recorded on-chain for transparency).
/// @param ccWindowEndsAt reveal + 72h. CC's own buyback window — this, NOT the 66h
/// user window, is the boundary the unwrap fee keys off.
struct CardMeta {
bytes32 solanaMintHash;
bytes32 ccOpenTxHash;
uint64 revealAt;
uint64 userWindowEndsAt;
uint64 ccWindowEndsAt;
}
/// @notice EIP-712 payload: an operator-signed snapshot of a card's insured value.
/// @dev Insured value is a moving, off-chain number (doc 01 T2). We never store it
/// on-chain as truth; the unwrap fee is computed from a fresh signed quote.
struct UnwrapQuote {
uint256 tokenId;
uint256 insuredValueUsdg;
uint256 expiry;
}
bytes32 private constant UNWRAP_QUOTE_TYPEHASH =
keccak256("UnwrapQuote(uint256 tokenId,uint256 insuredValueUsdg,uint256 expiry)");
uint16 public constant BPS_DENOMINATOR = 10_000;
/// @notice Ceiling on the unwrap fee, hard-coded so no future config change can make
/// unwrapping punitive. 5% is the spread we would otherwise lose (doc 00 §2).
uint16 public constant MAX_UNWRAP_FEE_BPS = 500;
IERC20 public immutable usdg;
address public operator;
address public quoteSigner;
/// @notice The wallet that holds mirrors surrendered for sell-back. Only a mirror sitting
/// here can be burned, so a token in a user's own wallet is never destroyable.
address public custodian;
address public feeRecipient;
/// @notice 0 = unwraps are always free and need no signed quote. Stays 0 unless doc 01
/// T3 shows the CC buyback right travels with the NFT (the "bypass open" case).
uint16 public unwrapFeeBps;
uint256 public nextTokenId = 1;
mapping(uint256 orderId => uint256 tokenId) public mintedForOrder;
mapping(uint256 tokenId => uint256 orderId) public orderOfToken;
mapping(uint256 tokenId => CardMeta) private _cardMeta;
mapping(uint256 tokenId => string) private _tokenURIs;
event Minted(uint256 indexed tokenId, uint256 indexed orderId, address indexed to, CardMeta meta);
event BurnedForSell(uint256 indexed tokenId, uint256 indexed orderId, address indexed formerOwner);
event UnwrapRequested(uint256 indexed tokenId, address indexed owner, bytes solanaAddress, uint256 feePaidUsdg);
event OperatorUpdated(address indexed previous, address indexed current);
event QuoteSignerUpdated(address indexed previous, address indexed current);
event CustodianUpdated(address indexed previous, address indexed current);
event FeeRecipientUpdated(address indexed previous, address indexed current);
event UnwrapFeeUpdated(uint16 previousBps, uint16 currentBps);
error NotOperator();
error ZeroAddress();
error OrderAlreadyMinted(uint256 orderId);
error TokenDoesNotExist(uint256 tokenId);
error NotTokenOwner();
error FeeAboveMax(uint16 bps);
error QuoteExpired(uint256 expiry);
error BadQuoteSigner(address recovered);
/// @notice The mirror is not in custody, so it was never surrendered for a sell-back.
error NotInCustody(uint256 tokenId, address holder);
error CustodianNotSet();
error QuoteTokenMismatch();
error InvalidSolanaAddress();
modifier onlyOperator() {
if (msg.sender != operator) revert NotOperator();
_;
}
constructor(address usdg_, address owner_, address operator_, address feeRecipient_)
ERC721("Gatching Vault", "GVAULT")
Ownable(owner_)
EIP712("MirrorNFT", "1")
{
if (usdg_ == address(0) || owner_ == address(0)) revert ZeroAddress();
if (operator_ == address(0) || feeRecipient_ == address(0)) revert ZeroAddress();
usdg = IERC20(usdg_);
operator = operator_;
feeRecipient = feeRecipient_;
// quoteSigner defaults to the operator; unwrapFeeBps defaults to 0, so no quote is
// required until T3 says otherwise.
quoteSigner = operator_;
}
// ---------------------------------------------------------------- operator
/// @notice Mint the mirror for a revealed pack. One per orderId, forever.
/// @dev `mintedForOrder` is the on-chain source of truth that PackSale.forceRefund
/// checks — it must be written here and never cleared, including on burn, so a
/// burned-then-force-refunded order is impossible.
function mint(address to, uint256 orderId, CardMeta calldata meta, string calldata uri)
external
onlyOperator
returns (uint256 tokenId)
{
if (to == address(0)) revert ZeroAddress();
if (mintedForOrder[orderId] != 0) revert OrderAlreadyMinted(orderId);
tokenId = nextTokenId++;
mintedForOrder[orderId] = tokenId;
orderOfToken[tokenId] = orderId;
_cardMeta[tokenId] = meta;
_tokenURIs[tokenId] = uri;
_safeMint(to, tokenId);
emit Minted(tokenId, orderId, to, meta);
}
/// @notice Burn after a sell-back payout has landed. Settle-then-pay means the USDG is
/// already with the user by the time this runs (doc 02 §4).
function burnForSell(uint256 tokenId) external onlyOperator {
address holder = _requireOwned(tokenId);
/**
* Only ever burn a mirror that is ACTUALLY IN CUSTODY.
*
* Without this, `burnForSell` took nothing but a tokenId and would destroy any
* holder's mirror on the operator's say-so. A compromised worker key — a hot key, the
* same one that signs fulfilments — could burn EVERY mirror in existence while the
* underlying Solana cards stayed in custody: total loss of every user's claim, with
* no USDG paid and no consent given. It was the largest single-key blast radius in
* the system.
*
* No signature scheme is needed to fix it, because consent already exists in the
* design: a sell-back BEGINS with the holder transferring their mirror to custody.
* That transfer is the consent. Requiring custody here simply encodes on chain what
* the buyback pipeline already refuses to proceed without off chain
* (`buyback.ts` re-reads ownership and declines to burn if we are not the holder).
*
* A mirror still in a user's wallet is now unburnable, by anyone, always.
*/
if (custodian == address(0)) revert CustodianNotSet();
if (holder != custodian) revert NotInCustody(tokenId, holder);
uint256 orderId = orderOfToken[tokenId];
_burn(tokenId);
emit BurnedForSell(tokenId, orderId, holder);
}
// ---------------------------------------------------------------- token owner
/// @notice Burn the mirror to claim the underlying Solana NFT. The relayer watches for
/// UnwrapRequested and transfers from custody (doc 02 §5).
/// @param solanaAddress Raw 32-byte Solana pubkey. Validated for length here and for
/// base58/curve validity in the frontend and worker.
/// @dev When `unwrapFeeBps` is 0, or the CC window has already closed, the quote
/// arguments are ignored entirely — pass zeroes and an empty signature.
function burnForUnwrap(
uint256 tokenId,
bytes calldata solanaAddress,
UnwrapQuote calldata quote,
bytes calldata signature
) external nonReentrant {
address holder = _requireOwned(tokenId);
if (msg.sender != holder) revert NotTokenOwner();
if (solanaAddress.length != 32) revert InvalidSolanaAddress();
uint256 fee = 0;
if (unwrapFeeBps > 0 && block.timestamp < _cardMeta[tokenId].ccWindowEndsAt) {
fee = _verifyAndPriceQuote(tokenId, quote, signature);
}
// Effects before interactions: burn first, then pull the fee.
_burn(tokenId);
if (fee > 0) {
usdg.safeTransferFrom(msg.sender, feeRecipient, fee);
}
emit UnwrapRequested(tokenId, holder, solanaAddress, fee);
}
/// @notice What `burnForUnwrap` would charge for this quote right now. View-only helper
/// for the frontend; the authoritative check happens in the burn.
function previewUnwrapFee(uint256 tokenId, uint256 insuredValueUsdg) external view returns (uint256) {
_requireOwned(tokenId);
if (unwrapFeeBps == 0 || block.timestamp >= _cardMeta[tokenId].ccWindowEndsAt) return 0;
return (insuredValueUsdg * unwrapFeeBps) / BPS_DENOMINATOR;
}
function _verifyAndPriceQuote(uint256 tokenId, UnwrapQuote calldata quote, bytes calldata signature)
private
view
returns (uint256)
{
if (quote.tokenId != tokenId) revert QuoteTokenMismatch();
if (block.timestamp > quote.expiry) revert QuoteExpired(quote.expiry);
bytes32 digest = _hashTypedDataV4(
keccak256(abi.encode(UNWRAP_QUOTE_TYPEHASH, quote.tokenId, quote.insuredValueUsdg, quote.expiry))
);
address recovered = ECDSA.recover(digest, signature);
if (recovered != quoteSigner) revert BadQuoteSigner(recovered);
return (quote.insuredValueUsdg * unwrapFeeBps) / BPS_DENOMINATOR;
}
// ---------------------------------------------------------------- views
function cardMeta(uint256 tokenId) external view returns (CardMeta memory) {
_requireOwned(tokenId);
return _cardMeta[tokenId];
}
function tokenURI(uint256 tokenId) public view override returns (string memory) {
_requireOwned(tokenId);
return _tokenURIs[tokenId];
}
// ---------------------------------------------------------------- admin
function setOperator(address operator_) external onlyOwner {
if (operator_ == address(0)) revert ZeroAddress();
emit OperatorUpdated(operator, operator_);
operator = operator_;
}
/// @notice Set the custody wallet whose mirrors may be burned on sell-back.
function setCustodian(address custodian_) external onlyOwner {
emit CustodianUpdated(custodian, custodian_);
custodian = custodian_;
}
function setQuoteSigner(address quoteSigner_) external onlyOwner {
if (quoteSigner_ == address(0)) revert ZeroAddress();
emit QuoteSignerUpdated(quoteSigner, quoteSigner_);
quoteSigner = quoteSigner_;
}
function setFeeRecipient(address feeRecipient_) external onlyOwner {
if (feeRecipient_ == address(0)) revert ZeroAddress();
emit FeeRecipientUpdated(feeRecipient, feeRecipient_);
feeRecipient = feeRecipient_;
}
/// @notice Set the in-window unwrap fee. Launch default is 0; only doc 01 T3's
/// "bypass open" outcome justifies raising it, and never above 5%.
function setUnwrapFeeBps(uint16 bps) external onlyOwner {
if (bps > MAX_UNWRAP_FEE_BPS) revert FeeAboveMax(bps);
emit UnwrapFeeUpdated(unwrapFeeBps, bps);
unwrapFeeBps = bps;
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "usdg_",
"type": "address",
"internalType": "address"
},
{
"name": "owner_",
"type": "address",
"internalType": "address"
},
{
"name": "operator_",
"type": "address",
"internalType": "address"
},
{
"name": "feeRecipient_",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "BadQuoteSigner",
"type": "error",
"inputs": [
{
"name": "recovered",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "CustodianNotSet",
"type": "error",
"inputs": []
},
{
"name": "ECDSAInvalidSignature",
"type": "error",
"inputs": []
},
{
"name": "ECDSAInvalidSignatureLength",
"type": "error",
"inputs": [
{
"name": "length",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ECDSAInvalidSignatureS",
"type": "error",
"inputs": [
{
"name": "s",
"type": "bytes32",
"internalType": "bytes32"
}
]
},
{
"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": "FeeAboveMax",
"type": "error",
"inputs": [
{
"name": "bps",
"type": "uint16",
"internalType": "uint16"
}
]
},
{
"name": "InvalidShortString",
"type": "error",
"inputs": []
},
{
"name": "InvalidSolanaAddress",
"type": "error",
"inputs": []
},
{
"name": "NotInCustody",
"type": "error",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "holder",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "NotOperator",
"type": "error",
"inputs": []
},
{
"name": "NotTokenOwner",
"type": "error",
"inputs": []
},
{
"name": "OrderAlreadyMinted",
"type": "error",
"inputs": [
{
"name": "orderId",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "OwnableInvalidOwner",
"type": "error",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "OwnableUnauthorizedAccount",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "QuoteExpired",
"type": "error",
"inputs": [
{
"name": "expiry",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "QuoteTokenMismatch",
"type": "error",
"inputs": []
},
{
"name": "ReentrancyGuardReentrantCall",
"type": "error",
"inputs": []
},
{
"name": "SafeERC20FailedOperation",
"type": "error",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "StringTooLong",
"type": "error",
"inputs": [
{
"name": "str",
"type": "string",
"internalType": "string"
}
]
},
{
"name": "TokenDoesNotExist",
"type": "error",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ZeroAddress",
"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": "BurnedForSell",
"type": "event",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "orderId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "formerOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "CustodianUpdated",
"type": "event",
"inputs": [
{
"name": "previous",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "current",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "EIP712DomainChanged",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "FeeRecipientUpdated",
"type": "event",
"inputs": [
{
"name": "previous",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "current",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Minted",
"type": "event",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "orderId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "meta",
"type": "tuple",
"indexed": false,
"components": [
{
"name": "solanaMintHash",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "ccOpenTxHash",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "revealAt",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "userWindowEndsAt",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "ccWindowEndsAt",
"type": "uint64",
"internalType": "uint64"
}
],
"internalType": "struct MirrorNFT.CardMeta"
}
],
"anonymous": false
},
{
"name": "OperatorUpdated",
"type": "event",
"inputs": [
{
"name": "previous",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "current",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"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": "QuoteSignerUpdated",
"type": "event",
"inputs": [
{
"name": "previous",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "current",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"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": "UnwrapFeeUpdated",
"type": "event",
"inputs": [
{
"name": "previousBps",
"type": "uint16",
"indexed": false,
"internalType": "uint16"
},
{
"name": "currentBps",
"type": "uint16",
"indexed": false,
"internalType": "uint16"
}
],
"anonymous": false
},
{
"name": "UnwrapRequested",
"type": "event",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "solanaAddress",
"type": "bytes",
"indexed": false,
"internalType": "bytes"
},
{
"name": "feePaidUsdg",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "BPS_DENOMINATOR",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "MAX_UNWRAP_FEE_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"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": "burnForSell",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "burnForUnwrap",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "solanaAddress",
"type": "bytes",
"internalType": "bytes"
},
{
"name": "quote",
"type": "tuple",
"components": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "insuredValueUsdg",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "expiry",
"type": "uint256",
"internalType": "uint256"
}
],
"internalType": "struct MirrorNFT.UnwrapQuote"
},
{
"name": "signature",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "cardMeta",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "tuple",
"components": [
{
"name": "solanaMintHash",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "ccOpenTxHash",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "revealAt",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "userWindowEndsAt",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "ccWindowEndsAt",
"type": "uint64",
"internalType": "uint64"
}
],
"internalType": "struct MirrorNFT.CardMeta"
}
],
"stateMutability": "view"
},
{
"name": "custodian",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "eip712Domain",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "fields",
"type": "bytes1",
"internalType": "bytes1"
},
{
"name": "name",
"type": "string",
"internalType": "string"
},
{
"name": "version",
"type": "string",
"internalType": "string"
},
{
"name": "chainId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "verifyingContract",
"type": "address",
"internalType": "address"
},
{
"name": "salt",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "extensions",
"type": "uint256[]",
"internalType": "uint256[]"
}
],
"stateMutability": "view"
},
{
"name": "feeRecipient",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"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": "mint",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "orderId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "meta",
"type": "tuple",
"components": [
{
"name": "solanaMintHash",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "ccOpenTxHash",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "revealAt",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "userWindowEndsAt",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "ccWindowEndsAt",
"type": "uint64",
"internalType": "uint64"
}
],
"internalType": "struct MirrorNFT.CardMeta"
},
{
"name": "uri",
"type": "string",
"internalType": "string"
}
],
"outputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "mintedForOrder",
"type": "function",
"inputs": [
{
"name": "orderId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"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": "operator",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "orderOfToken",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "orderId",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "ownerOf",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "previewUnwrapFee",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "insuredValueUsdg",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "quoteSigner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"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": "setCustodian",
"type": "function",
"inputs": [
{
"name": "custodian_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setFeeRecipient",
"type": "function",
"inputs": [
{
"name": "feeRecipient_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setOperator",
"type": "function",
"inputs": [
{
"name": "operator_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setQuoteSigner",
"type": "function",
"inputs": [
{
"name": "quoteSigner_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setUnwrapFeeBps",
"type": "function",
"inputs": [
{
"name": "bps",
"type": "uint16",
"internalType": "uint16"
}
],
"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": "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"
},
{
"name": "unwrapFeeBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "usdg",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IERC20"
}
],
"stateMutability": "view"
}
]0x6101806040526001600e5534801562000016575f80fd5b5060405162002bcc38038062002bcc83398101604081905262000039916200037e565b60405180604001604052806009815260200168135a5c9c9bdc93919560ba1b815250604051806040016040528060018152602001603160f81b815250846040518060400160405280600e81526020016d11d85d18da1a5b99c815985d5b1d60921b8152506040518060400160405280600681526020016511d59055531560d21b815250815f9081620000cc919062000476565b506001620000db828262000476565b5050506001600160a01b0381166200010d57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b620001188162000297565b5062000126826007620002e8565b6101205262000137816008620002e8565b61014052815160208084019190912060e052815190820120610100524660a052620001c460e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c05260016009556001600160a01b0384161580620001f057506001600160a01b038316155b156200020f5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03821615806200022d57506001600160a01b038116155b156200024c5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0393841661016052600a80546001600160a01b0319908116938616938417909155600d805482169290951691909117909355600b80549093161790915550620005b4565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f6020835110156200030757620002ff8362000320565b90506200031a565b8162000314848262000476565b5060ff90505b92915050565b5f80829050601f815111156200034d578260405163305a27a960e01b815260040162000104919062000542565b80516200035a8262000590565b179392505050565b80516001600160a01b038116811462000379575f80fd5b919050565b5f805f806080858703121562000392575f80fd5b6200039d8562000362565b9350620003ad6020860162000362565b9250620003bd6040860162000362565b9150620003cd6060860162000362565b905092959194509250565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200040157607f821691505b6020821081036200042057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200047157805f5260205f20601f840160051c810160208510156200044d5750805b601f840160051c820191505b818110156200046e575f815560010162000459565b50505b505050565b81516001600160401b03811115620004925762000492620003d8565b620004aa81620004a38454620003ec565b8462000426565b602080601f831160018114620004e0575f8415620004c85750858301515b5f19600386901b1c1916600185901b1785556200053a565b5f85815260208120601f198616915b828110156200051057888601518255948401946001909101908401620004ef565b50858210156200052e57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602080835283518060208501525f5b81811015620005705785810183015185820160400152820162000552565b505f604082860101526040601f19601f8301168501019250505092915050565b8051602080830151919081101562000420575f1960209190910360031b1b16919050565b60805160a05160c05160e051610100516101205161014051610160516125b5620006175f395f818161055c0152610f0c01525f61128c01525f61125a01525f611b5e01525f611b3601525f611a9101525f611abb01525f611ae501526125b55ff3fe608060405234801561000f575f80fd5b5060043610610229575f3560e01c806384b0196e1161012a578063c87b56dd116100b4578063e985e9c511610079578063e985e9c51461051e578063f2fde38b14610531578063f413bdb314610544578063f5b91b7b14610557578063fe9a5ecf1461057e575f80fd5b8063c87b56dd146104c9578063ce94f036146104dc578063e1269d0c146104ef578063e1a4521814610502578063e74b981b1461050b575f80fd5b8063b1edcbcb116100fa578063b1edcbcb1461045c578063b3ab15fb1461047b578063b4c2bf2a1461048e578063b88d4fde146104a3578063bc4516a5146104b6575f80fd5b806384b0196e146104155780638da5cb5b1461043057806395d89b4114610441578063a22cb46514610449575f80fd5b806342842e0e116101b657806366a6a0da1161017b57806366a6a0da146103c257806370a08231146103d5578063715018a6146103e857806375794a3c146103f05780637caca655146103f9575f80fd5b806342842e0e14610363578063469048401461037657806356ce180a14610389578063570ca7351461039c5780636352211e146103af575f80fd5b8063095ea7b3116101fc578063095ea7b3146102b65780631e36675d146102cb57806323b872dd1461032a578063375b74c31461033d578063403f373114610350575f80fd5b806301ffc9a71461022d57806303432c971461025557806306fdde0314610276578063081812fc1461028b575b5f80fd5b61024061023b366004611db3565b61059d565b60405190151581526020015b60405180910390f35b610268610263366004611e2d565b6105ee565b60405190815260200161024c565b61027e610730565b60405161024c9190611ee5565b61029e610299366004611ef7565b6107bf565b6040516001600160a01b03909116815260200161024c565b6102c96102c4366004611f0e565b6107e6565b005b6102de6102d9366004611ef7565b6107f5565b604080518251815260208084015190820152828201516001600160401b03908116928201929092526060808401518316908201526080928301519091169181019190915260a00161024c565b6102c9610338366004611f36565b61088e565b600c5461029e906001600160a01b031681565b6102c961035e366004611f6f565b610917565b6102c9610371366004611f36565b61097a565b600d5461029e906001600160a01b031681565b6102c9610397366004611f6f565b610999565b600a5461029e906001600160a01b031681565b61029e6103bd366004611ef7565b610a23565b6102686103d0366004611f88565b610a2d565b6102686103e3366004611f6f565b610aab565b6102c9610af0565b610268600e5481565b6104026101f481565b60405161ffff909116815260200161024c565b61041d610b03565b60405161024c9796959493929190611fa8565b6006546001600160a01b031661029e565b61027e610b45565b6102c961045736600461203f565b610b54565b61026861046a366004611ef7565b60106020525f908152604090205481565b6102c9610489366004611f6f565b610b5f565b600d5461040290600160a01b900461ffff1681565b6102c96104b136600461208c565b610be9565b6102c96104c4366004611ef7565b610c01565b61027e6104d7366004611ef7565b610cf6565b6102c96104ea366004612160565b610d9d565b6102c96104fd366004612181565b610e3d565b61040261271081565b6102c9610519366004611f6f565b610f91565b61024061052c366004612212565b61101b565b6102c961053f366004611f6f565b611048565b600b5461029e906001600160a01b031681565b61029e7f000000000000000000000000000000000000000000000000000000000000000081565b61026861058c366004611ef7565b600f6020525f908152604090205481565b5f6001600160e01b031982166380ac58cd60e01b14806105cd57506001600160e01b03198216635b5e139f60e01b145b806105e857506301ffc9a760e01b6001600160e01b03198316145b92915050565b600a545f906001600160a01b0316331461061b57604051631f0853c160e21b815260040160405180910390fd5b6001600160a01b0386166106425760405163d92e233d60e01b815260040160405180910390fd5b5f858152600f60205260409020541561067657604051635983a9fd60e01b8152600481018690526024015b60405180910390fd5b600e8054905f61068583612257565b909155505f868152600f60209081526040808320849055838352601082528083208990556011909152902090915084906106bf8282612283565b50505f8181526012602052604090206106d9838583612388565b506106e48682611085565b856001600160a01b031685827fdc229bbc76a2da105cbdf8aeae4ca4d729a1db4f07cac9824cd991d596835a628760405161071f9190612441565b60405180910390a495945050505050565b60605f805461073e9061230c565b80601f016020809104026020016040519081016040528092919081815260200182805461076a9061230c565b80156107b55780601f1061078c576101008083540402835291602001916107b5565b820191905f5260205f20905b81548152906001019060200180831161079857829003601f168201915b5050505050905090565b5f6107c98261109e565b505f828152600460205260409020546001600160a01b03166105e8565b6107f18282336110d6565b5050565b6040805160a0810182525f808252602082018190529181018290526060810182905260808101919091526108288261109e565b50505f90815260116020908152604091829020825160a08101845281548152600182015492810192909252600201546001600160401b038082169383019390935268010000000000000000810483166060830152600160801b9004909116608082015290565b6001600160a01b0382166108b757604051633250574960e11b81525f600482015260240161066d565b5f6108c38383336110e3565b9050836001600160a01b0316816001600160a01b031614610911576040516364283d7b60e01b81526001600160a01b038086166004830152602482018490528216604482015260640161066d565b50505050565b61091f6111d5565b600c546040516001600160a01b038084169216907fb2acc6aeb8e34e039efca33cef7c32bbb131a9cf351b43e1296d793364f693ab905f90a3600c80546001600160a01b0319166001600160a01b0392909216919091179055565b61099483838360405180602001604052805f815250610be9565b505050565b6109a16111d5565b6001600160a01b0381166109c85760405163d92e233d60e01b815260040160405180910390fd5b600b546040516001600160a01b038084169216907f0b6b513ed661cb195db5434de123da765c2d8ef310958c00646bb5a872cb1afa905f90a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6105e88261109e565b5f610a378361109e565b50600d54600160a01b900461ffff161580610a7257505f83815260116020526040902060020154600160801b90046001600160401b03164210155b15610a7e57505f6105e8565b600d5461271090610a9a90600160a01b900461ffff16846124a7565b610aa491906124be565b9392505050565b5f6001600160a01b038216610ad5576040516322718ad960e21b81525f600482015260240161066d565b506001600160a01b03165f9081526003602052604090205490565b610af86111d5565b610b015f611202565b565b5f6060805f805f6060610b14611253565b610b1c611285565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b60606001805461073e9061230c565b6107f13383836112b2565b610b676111d5565b6001600160a01b038116610b8e5760405163d92e233d60e01b815260040160405180910390fd5b600a546040516001600160a01b038084169216907ffbe5b6cbafb274f445d7fed869dc77a838d8243a22c460de156560e8857cad03905f90a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b610bf484848461088e565b6109113385858585611350565b600a546001600160a01b03163314610c2c57604051631f0853c160e21b815260040160405180910390fd5b5f610c368261109e565b600c549091506001600160a01b0316610c6257604051632c65d67160e11b815260040160405180910390fd5b600c546001600160a01b03828116911614610ca257604051630c5f340f60e01b8152600481018390526001600160a01b038216602482015260440161066d565b5f82815260106020526040902054610cb983611476565b816001600160a01b031681847f6f095686b865a47c84c22acd0fed83af951332adae24e3860e03c8868f8ca6ed60405160405180910390a4505050565b6060610d018261109e565b505f8281526012602052604090208054610d1a9061230c565b80601f0160208091040260200160405190810160405280929190818152602001828054610d469061230c565b8015610d915780601f10610d6857610100808354040283529160200191610d91565b820191905f5260205f20905b815481529060010190602001808311610d7457829003601f168201915b50505050509050919050565b610da56111d5565b6101f461ffff82161115610dd2576040516357f74ddd60e11b815261ffff8216600482015260240161066d565b600d546040805161ffff600160a01b9093048316815291831660208301527f1bffe947a47fd6c4f545f02d63300f827febccb80b418fe21dbe811be962e218910160405180910390a1600d805461ffff909216600160a01b0261ffff60a01b19909216919091179055565b610e456114ae565b5f610e4f8761109e565b9050336001600160a01b03821614610e7a576040516359dc379f60e01b815260040160405180910390fd5b60208514610e9b57604051636f86172f60e11b815260040160405180910390fd5b600d545f90600160a01b900461ffff1615801590610ed857505f88815260116020526040902060020154600160801b90046001600160401b031642105b15610eec57610ee9888686866114d8565b90505b610ef588611476565b8015610f3757600d54610f37906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169133911684611641565b816001600160a01b0316887fc00afa56692b61f7ceeb3bcbb280a9b9b63a81143e8f010fc3fb9478e954f200898985604051610f75939291906124dd565b60405180910390a35050610f896001600955565b505050505050565b610f996111d5565b6001600160a01b038116610fc05760405163d92e233d60e01b815260040160405180910390fd5b600d546040516001600160a01b038084169216907faaebcf1bfa00580e41d966056b48521fa9f202645c86d4ddf28113e617c1b1d3905f90a3600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b6110506111d5565b6001600160a01b03811661107957604051631e4fbdf760e01b81525f600482015260240161066d565b61108281611202565b50565b6107f1828260405180602001604052805f81525061169b565b5f818152600260205260408120546001600160a01b0316806105e857604051637e27328960e01b81526004810184905260240161066d565b61099483838360016116b2565b5f828152600260205260408120546001600160a01b039081169083161561110f5761110f8184866117b6565b6001600160a01b038116156111495761112a5f855f806116b2565b6001600160a01b0381165f90815260036020526040902080545f190190555b6001600160a01b03851615611177576001600160a01b0385165f908152600360205260409020805460010190555b5f8481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b6006546001600160a01b03163314610b015760405163118cdaa760e01b815233600482015260240161066d565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60606112807f0000000000000000000000000000000000000000000000000000000000000000600761181a565b905090565b60606112807f0000000000000000000000000000000000000000000000000000000000000000600861181a565b6001600160a01b0382166112e457604051630b61174360e31b81526001600160a01b038316600482015260240161066d565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b1561146f57604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290611392908890889087908790600401612514565b6020604051808303815f875af19250505080156113cc575060408051601f3d908101601f191682019092526113c991810190612550565b60015b611433573d8080156113f9576040519150601f19603f3d011682016040523d82523d5f602084013e6113fe565b606091505b5080515f0361142b57604051633250574960e11b81526001600160a01b038516600482015260240161066d565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b14610f8957604051633250574960e11b81526001600160a01b038516600482015260240161066d565b5050505050565b5f6114825f835f6110e3565b90506001600160a01b0381166107f157604051637e27328960e01b81526004810183905260240161066d565b6002600954036114d157604051633ee5aeb560e01b815260040160405180910390fd5b6002600955565b5f833585146114fa5760405163ef6f1f1560e01b815260040160405180910390fd5b83604001354211156115255760408051638395159960e01b815290850135600482015260240161066d565b604080517fb809f7420f71ff8be508e8e394bc999801aeeb84d438810566e7d76c6f80a8b360208281019190915286358284015286013560608201529085013560808201525f9061158e9060a001604051602081830303815290604052805190602001206118c3565b90505f6115d08286868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506118ef92505050565b600b549091506001600160a01b0380831691161461160c5760405163586aa61360e01b81526001600160a01b038216600482015260240161066d565b600d546127109061162c90600160a01b900461ffff1660208901356124a7565b61163691906124be565b979650505050505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610911908590611917565b6116a58383611983565b610994335f858585611350565b80806116c657506001600160a01b03821615155b15611787575f6116d58461109e565b90506001600160a01b038316158015906117015750826001600160a01b0316816001600160a01b031614155b80156117145750611712818461101b565b155b1561173d5760405163a9fbf51f60e01b81526001600160a01b038416600482015260240161066d565b81156117855783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b50505f90815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6117c18383836119e4565b610994576001600160a01b0383166117ef57604051637e27328960e01b81526004810182905260240161066d565b60405163177e802f60e01b81526001600160a01b03831660048201526024810182905260440161066d565b606060ff83146118345761182d83611a48565b90506105e8565b8180546118409061230c565b80601f016020809104026020016040519081016040528092919081815260200182805461186c9061230c565b80156118b75780601f1061188e576101008083540402835291602001916118b7565b820191905f5260205f20905b81548152906001019060200180831161189a57829003601f168201915b505050505090506105e8565b5f6105e86118cf611a85565b8360405161190160f01b8152600281019290925260228201526042902090565b5f805f806118fd8686611bae565b92509250925061190d8282611bf7565b5090949350505050565b5f8060205f8451602086015f885af180611936576040513d5f823e3d81fd5b50505f513d9150811561194d57806001141561195a565b6001600160a01b0384163b155b1561091157604051635274afe760e01b81526001600160a01b038516600482015260240161066d565b6001600160a01b0382166119ac57604051633250574960e11b81525f600482015260240161066d565b5f6119b883835f6110e3565b90506001600160a01b03811615610994576040516339e3563760e11b81525f600482015260240161066d565b5f6001600160a01b03831615801590611a405750826001600160a01b0316846001600160a01b03161480611a1d5750611a1d848461101b565b80611a4057505f828152600460205260409020546001600160a01b038481169116145b949350505050565b60605f611a5483611caf565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611add57507f000000000000000000000000000000000000000000000000000000000000000046145b15611b0757507f000000000000000000000000000000000000000000000000000000000000000090565b611280604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f805f8351604103611be5576020840151604085015160608601515f1a611bd788828585611cd6565b955095509550505050611bf0565b505081515f91506002905b9250925092565b5f826003811115611c0a57611c0a61256b565b03611c13575050565b6001826003811115611c2757611c2761256b565b03611c455760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115611c5957611c5961256b565b03611c7a5760405163fce698f760e01b81526004810182905260240161066d565b6003826003811115611c8e57611c8e61256b565b036107f1576040516335e2f38360e21b81526004810182905260240161066d565b5f60ff8216601f8111156105e857604051632cd44ac360e21b815260040160405180910390fd5b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115611d0f57505f91506003905082611d94565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611d60573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116611d8b57505f925060019150829050611d94565b92505f91508190505b9450945094915050565b6001600160e01b031981168114611082575f80fd5b5f60208284031215611dc3575f80fd5b8135610aa481611d9e565b80356001600160a01b0381168114611de4575f80fd5b919050565b5f8083601f840112611df9575f80fd5b5081356001600160401b03811115611e0f575f80fd5b602083019150836020828501011115611e26575f80fd5b9250929050565b5f805f805f858703610100811215611e43575f80fd5b611e4c87611dce565b95506020870135945060a0603f1982011215611e66575f80fd5b5060408601925060e08601356001600160401b03811115611e85575f80fd5b611e9188828901611de9565b969995985093965092949392505050565b5f81518084525f5b81811015611ec657602081850181015186830182015201611eaa565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610aa46020830184611ea2565b5f60208284031215611f07575f80fd5b5035919050565b5f8060408385031215611f1f575f80fd5b611f2883611dce565b946020939093013593505050565b5f805f60608486031215611f48575f80fd5b611f5184611dce565b9250611f5f60208501611dce565b9150604084013590509250925092565b5f60208284031215611f7f575f80fd5b610aa482611dce565b5f8060408385031215611f99575f80fd5b50508035926020909101359150565b60ff60f81b881681525f602060e06020840152611fc860e084018a611ea2565b8381036040850152611fda818a611ea2565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825260208088019350909101905f5b8181101561202d57835183529284019291840191600101612011565b50909c9b505050505050505050505050565b5f8060408385031215612050575f80fd5b61205983611dce565b91506020830135801515811461206d575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f805f806080858703121561209f575f80fd5b6120a885611dce565b93506120b660208601611dce565b92506040850135915060608501356001600160401b03808211156120d8575f80fd5b818701915087601f8301126120eb575f80fd5b8135818111156120fd576120fd612078565b604051601f8201601f19908116603f0116810190838211818310171561212557612125612078565b816040528281528a602084870101111561213d575f80fd5b826020860160208301375f60208483010152809550505050505092959194509250565b5f60208284031215612170575f80fd5b813561ffff81168114610aa4575f80fd5b5f805f805f8086880360c0811215612197575f80fd5b8735965060208801356001600160401b03808211156121b4575f80fd5b6121c08b838c01611de9565b90985096508691506060603f19840112156121d9575f80fd5b60408a01955060a08a01359250808311156121f2575f80fd5b505061220089828a01611de9565b979a9699509497509295939492505050565b5f8060408385031215612223575f80fd5b61222c83611dce565b915061223a60208401611dce565b90509250929050565b634e487b7160e01b5f52601160045260245ffd5b5f6001820161226857612268612243565b5060010190565b6001600160401b0381168114611082575f80fd5b81358155602082013560018201556002810160408301356122a38161226f565b815460608501356122b38161226f565b60808601356122c18161226f565b6001600160401b0360801b8160801b166001600160401b0385166001600160401b0360c01b8516176fffffffffffffffff00000000000000008460401b161717855550505050505050565b600181811c9082168061232057607f821691505b60208210810361233e57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561099457805f5260205f20601f840160051c810160208510156123695750805b601f840160051c820191505b8181101561146f575f8155600101612375565b6001600160401b0383111561239f5761239f612078565b6123b3836123ad835461230c565b83612344565b5f601f8411600181146123e4575f85156123cd5750838201355b5f19600387901b1c1916600186901b17835561146f565b5f83815260208120601f198716915b8281101561241357868501358255602094850194600190920191016123f3565b508682101561242f575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b813581526020808301359082015260a0810160408301356124618161226f565b6001600160401b0390811660408401526060840135906124808261226f565b90811660608401526080840135906124978261226f565b8082166080850152505092915050565b80820281158282048414176105e8576105e8612243565b5f826124d857634e487b7160e01b5f52601260045260245ffd5b500490565b60408152826040820152828460608301375f606084830101525f6060601f19601f8601168301019050826020830152949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061254690830184611ea2565b9695505050505050565b5f60208284031215612560575f80fd5b8151610aa481611d9e565b634e487b7160e01b5f52602160045260245ffdfea26469706673582212202565532b0d3740b1ea750db24945adb8e1ed595d64ead388e48961abf356820264736f6c634300081800330000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d16800000000000000000000000000770e4b22527021a7e0e3b317602e57d7157dac00000000000000000000000000770e4b22527021a7e0e3b317602e57d7157dac00000000000000000000000000770e4b22527021a7e0e3b317602e57d7157dac
0x608060405234801561000f575f80fd5b5060043610610229575f3560e01c806384b0196e1161012a578063c87b56dd116100b4578063e985e9c511610079578063e985e9c51461051e578063f2fde38b14610531578063f413bdb314610544578063f5b91b7b14610557578063fe9a5ecf1461057e575f80fd5b8063c87b56dd146104c9578063ce94f036146104dc578063e1269d0c146104ef578063e1a4521814610502578063e74b981b1461050b575f80fd5b8063b1edcbcb116100fa578063b1edcbcb1461045c578063b3ab15fb1461047b578063b4c2bf2a1461048e578063b88d4fde146104a3578063bc4516a5146104b6575f80fd5b806384b0196e146104155780638da5cb5b1461043057806395d89b4114610441578063a22cb46514610449575f80fd5b806342842e0e116101b657806366a6a0da1161017b57806366a6a0da146103c257806370a08231146103d5578063715018a6146103e857806375794a3c146103f05780637caca655146103f9575f80fd5b806342842e0e14610363578063469048401461037657806356ce180a14610389578063570ca7351461039c5780636352211e146103af575f80fd5b8063095ea7b3116101fc578063095ea7b3146102b65780631e36675d146102cb57806323b872dd1461032a578063375b74c31461033d578063403f373114610350575f80fd5b806301ffc9a71461022d57806303432c971461025557806306fdde0314610276578063081812fc1461028b575b5f80fd5b61024061023b366004611db3565b61059d565b60405190151581526020015b60405180910390f35b610268610263366004611e2d565b6105ee565b60405190815260200161024c565b61027e610730565b60405161024c9190611ee5565b61029e610299366004611ef7565b6107bf565b6040516001600160a01b03909116815260200161024c565b6102c96102c4366004611f0e565b6107e6565b005b6102de6102d9366004611ef7565b6107f5565b604080518251815260208084015190820152828201516001600160401b03908116928201929092526060808401518316908201526080928301519091169181019190915260a00161024c565b6102c9610338366004611f36565b61088e565b600c5461029e906001600160a01b031681565b6102c961035e366004611f6f565b610917565b6102c9610371366004611f36565b61097a565b600d5461029e906001600160a01b031681565b6102c9610397366004611f6f565b610999565b600a5461029e906001600160a01b031681565b61029e6103bd366004611ef7565b610a23565b6102686103d0366004611f88565b610a2d565b6102686103e3366004611f6f565b610aab565b6102c9610af0565b610268600e5481565b6104026101f481565b60405161ffff909116815260200161024c565b61041d610b03565b60405161024c9796959493929190611fa8565b6006546001600160a01b031661029e565b61027e610b45565b6102c961045736600461203f565b610b54565b61026861046a366004611ef7565b60106020525f908152604090205481565b6102c9610489366004611f6f565b610b5f565b600d5461040290600160a01b900461ffff1681565b6102c96104b136600461208c565b610be9565b6102c96104c4366004611ef7565b610c01565b61027e6104d7366004611ef7565b610cf6565b6102c96104ea366004612160565b610d9d565b6102c96104fd366004612181565b610e3d565b61040261271081565b6102c9610519366004611f6f565b610f91565b61024061052c366004612212565b61101b565b6102c961053f366004611f6f565b611048565b600b5461029e906001600160a01b031681565b61029e7f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d16881565b61026861058c366004611ef7565b600f6020525f908152604090205481565b5f6001600160e01b031982166380ac58cd60e01b14806105cd57506001600160e01b03198216635b5e139f60e01b145b806105e857506301ffc9a760e01b6001600160e01b03198316145b92915050565b600a545f906001600160a01b0316331461061b57604051631f0853c160e21b815260040160405180910390fd5b6001600160a01b0386166106425760405163d92e233d60e01b815260040160405180910390fd5b5f858152600f60205260409020541561067657604051635983a9fd60e01b8152600481018690526024015b60405180910390fd5b600e8054905f61068583612257565b909155505f868152600f60209081526040808320849055838352601082528083208990556011909152902090915084906106bf8282612283565b50505f8181526012602052604090206106d9838583612388565b506106e48682611085565b856001600160a01b031685827fdc229bbc76a2da105cbdf8aeae4ca4d729a1db4f07cac9824cd991d596835a628760405161071f9190612441565b60405180910390a495945050505050565b60605f805461073e9061230c565b80601f016020809104026020016040519081016040528092919081815260200182805461076a9061230c565b80156107b55780601f1061078c576101008083540402835291602001916107b5565b820191905f5260205f20905b81548152906001019060200180831161079857829003601f168201915b5050505050905090565b5f6107c98261109e565b505f828152600460205260409020546001600160a01b03166105e8565b6107f18282336110d6565b5050565b6040805160a0810182525f808252602082018190529181018290526060810182905260808101919091526108288261109e565b50505f90815260116020908152604091829020825160a08101845281548152600182015492810192909252600201546001600160401b038082169383019390935268010000000000000000810483166060830152600160801b9004909116608082015290565b6001600160a01b0382166108b757604051633250574960e11b81525f600482015260240161066d565b5f6108c38383336110e3565b9050836001600160a01b0316816001600160a01b031614610911576040516364283d7b60e01b81526001600160a01b038086166004830152602482018490528216604482015260640161066d565b50505050565b61091f6111d5565b600c546040516001600160a01b038084169216907fb2acc6aeb8e34e039efca33cef7c32bbb131a9cf351b43e1296d793364f693ab905f90a3600c80546001600160a01b0319166001600160a01b0392909216919091179055565b61099483838360405180602001604052805f815250610be9565b505050565b6109a16111d5565b6001600160a01b0381166109c85760405163d92e233d60e01b815260040160405180910390fd5b600b546040516001600160a01b038084169216907f0b6b513ed661cb195db5434de123da765c2d8ef310958c00646bb5a872cb1afa905f90a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6105e88261109e565b5f610a378361109e565b50600d54600160a01b900461ffff161580610a7257505f83815260116020526040902060020154600160801b90046001600160401b03164210155b15610a7e57505f6105e8565b600d5461271090610a9a90600160a01b900461ffff16846124a7565b610aa491906124be565b9392505050565b5f6001600160a01b038216610ad5576040516322718ad960e21b81525f600482015260240161066d565b506001600160a01b03165f9081526003602052604090205490565b610af86111d5565b610b015f611202565b565b5f6060805f805f6060610b14611253565b610b1c611285565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b60606001805461073e9061230c565b6107f13383836112b2565b610b676111d5565b6001600160a01b038116610b8e5760405163d92e233d60e01b815260040160405180910390fd5b600a546040516001600160a01b038084169216907ffbe5b6cbafb274f445d7fed869dc77a838d8243a22c460de156560e8857cad03905f90a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b610bf484848461088e565b6109113385858585611350565b600a546001600160a01b03163314610c2c57604051631f0853c160e21b815260040160405180910390fd5b5f610c368261109e565b600c549091506001600160a01b0316610c6257604051632c65d67160e11b815260040160405180910390fd5b600c546001600160a01b03828116911614610ca257604051630c5f340f60e01b8152600481018390526001600160a01b038216602482015260440161066d565b5f82815260106020526040902054610cb983611476565b816001600160a01b031681847f6f095686b865a47c84c22acd0fed83af951332adae24e3860e03c8868f8ca6ed60405160405180910390a4505050565b6060610d018261109e565b505f8281526012602052604090208054610d1a9061230c565b80601f0160208091040260200160405190810160405280929190818152602001828054610d469061230c565b8015610d915780601f10610d6857610100808354040283529160200191610d91565b820191905f5260205f20905b815481529060010190602001808311610d7457829003601f168201915b50505050509050919050565b610da56111d5565b6101f461ffff82161115610dd2576040516357f74ddd60e11b815261ffff8216600482015260240161066d565b600d546040805161ffff600160a01b9093048316815291831660208301527f1bffe947a47fd6c4f545f02d63300f827febccb80b418fe21dbe811be962e218910160405180910390a1600d805461ffff909216600160a01b0261ffff60a01b19909216919091179055565b610e456114ae565b5f610e4f8761109e565b9050336001600160a01b03821614610e7a576040516359dc379f60e01b815260040160405180910390fd5b60208514610e9b57604051636f86172f60e11b815260040160405180910390fd5b600d545f90600160a01b900461ffff1615801590610ed857505f88815260116020526040902060020154600160801b90046001600160401b031642105b15610eec57610ee9888686866114d8565b90505b610ef588611476565b8015610f3757600d54610f37906001600160a01b037f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d16881169133911684611641565b816001600160a01b0316887fc00afa56692b61f7ceeb3bcbb280a9b9b63a81143e8f010fc3fb9478e954f200898985604051610f75939291906124dd565b60405180910390a35050610f896001600955565b505050505050565b610f996111d5565b6001600160a01b038116610fc05760405163d92e233d60e01b815260040160405180910390fd5b600d546040516001600160a01b038084169216907faaebcf1bfa00580e41d966056b48521fa9f202645c86d4ddf28113e617c1b1d3905f90a3600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b6110506111d5565b6001600160a01b03811661107957604051631e4fbdf760e01b81525f600482015260240161066d565b61108281611202565b50565b6107f1828260405180602001604052805f81525061169b565b5f818152600260205260408120546001600160a01b0316806105e857604051637e27328960e01b81526004810184905260240161066d565b61099483838360016116b2565b5f828152600260205260408120546001600160a01b039081169083161561110f5761110f8184866117b6565b6001600160a01b038116156111495761112a5f855f806116b2565b6001600160a01b0381165f90815260036020526040902080545f190190555b6001600160a01b03851615611177576001600160a01b0385165f908152600360205260409020805460010190555b5f8481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b6006546001600160a01b03163314610b015760405163118cdaa760e01b815233600482015260240161066d565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60606112807f4d6972726f724e46540000000000000000000000000000000000000000000009600761181a565b905090565b60606112807f3100000000000000000000000000000000000000000000000000000000000001600861181a565b6001600160a01b0382166112e457604051630b61174360e31b81526001600160a01b038316600482015260240161066d565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b1561146f57604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290611392908890889087908790600401612514565b6020604051808303815f875af19250505080156113cc575060408051601f3d908101601f191682019092526113c991810190612550565b60015b611433573d8080156113f9576040519150601f19603f3d011682016040523d82523d5f602084013e6113fe565b606091505b5080515f0361142b57604051633250574960e11b81526001600160a01b038516600482015260240161066d565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b14610f8957604051633250574960e11b81526001600160a01b038516600482015260240161066d565b5050505050565b5f6114825f835f6110e3565b90506001600160a01b0381166107f157604051637e27328960e01b81526004810183905260240161066d565b6002600954036114d157604051633ee5aeb560e01b815260040160405180910390fd5b6002600955565b5f833585146114fa5760405163ef6f1f1560e01b815260040160405180910390fd5b83604001354211156115255760408051638395159960e01b815290850135600482015260240161066d565b604080517fb809f7420f71ff8be508e8e394bc999801aeeb84d438810566e7d76c6f80a8b360208281019190915286358284015286013560608201529085013560808201525f9061158e9060a001604051602081830303815290604052805190602001206118c3565b90505f6115d08286868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506118ef92505050565b600b549091506001600160a01b0380831691161461160c5760405163586aa61360e01b81526001600160a01b038216600482015260240161066d565b600d546127109061162c90600160a01b900461ffff1660208901356124a7565b61163691906124be565b979650505050505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610911908590611917565b6116a58383611983565b610994335f858585611350565b80806116c657506001600160a01b03821615155b15611787575f6116d58461109e565b90506001600160a01b038316158015906117015750826001600160a01b0316816001600160a01b031614155b80156117145750611712818461101b565b155b1561173d5760405163a9fbf51f60e01b81526001600160a01b038416600482015260240161066d565b81156117855783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b50505f90815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6117c18383836119e4565b610994576001600160a01b0383166117ef57604051637e27328960e01b81526004810182905260240161066d565b60405163177e802f60e01b81526001600160a01b03831660048201526024810182905260440161066d565b606060ff83146118345761182d83611a48565b90506105e8565b8180546118409061230c565b80601f016020809104026020016040519081016040528092919081815260200182805461186c9061230c565b80156118b75780601f1061188e576101008083540402835291602001916118b7565b820191905f5260205f20905b81548152906001019060200180831161189a57829003601f168201915b505050505090506105e8565b5f6105e86118cf611a85565b8360405161190160f01b8152600281019290925260228201526042902090565b5f805f806118fd8686611bae565b92509250925061190d8282611bf7565b5090949350505050565b5f8060205f8451602086015f885af180611936576040513d5f823e3d81fd5b50505f513d9150811561194d57806001141561195a565b6001600160a01b0384163b155b1561091157604051635274afe760e01b81526001600160a01b038516600482015260240161066d565b6001600160a01b0382166119ac57604051633250574960e11b81525f600482015260240161066d565b5f6119b883835f6110e3565b90506001600160a01b03811615610994576040516339e3563760e11b81525f600482015260240161066d565b5f6001600160a01b03831615801590611a405750826001600160a01b0316846001600160a01b03161480611a1d5750611a1d848461101b565b80611a4057505f828152600460205260409020546001600160a01b038481169116145b949350505050565b60605f611a5483611caf565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f306001600160a01b037f00000000000000000000000024eb4103ea447ae25a333ce6c0099e53fd09e04816148015611add57507f000000000000000000000000000000000000000000000000000000000000123746145b15611b0757507f27390ce3ca601feda19a56a4d79cea1b375bc6c90bdf29a84bde3bcb9790a2e690565b611280604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f29983fe3c893eb8d4e5b61c6f45baf7f32023d63073796b109291e86260d9638918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f805f8351604103611be5576020840151604085015160608601515f1a611bd788828585611cd6565b955095509550505050611bf0565b505081515f91506002905b9250925092565b5f826003811115611c0a57611c0a61256b565b03611c13575050565b6001826003811115611c2757611c2761256b565b03611c455760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115611c5957611c5961256b565b03611c7a5760405163fce698f760e01b81526004810182905260240161066d565b6003826003811115611c8e57611c8e61256b565b036107f1576040516335e2f38360e21b81526004810182905260240161066d565b5f60ff8216601f8111156105e857604051632cd44ac360e21b815260040160405180910390fd5b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115611d0f57505f91506003905082611d94565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611d60573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116611d8b57505f925060019150829050611d94565b92505f91508190505b9450945094915050565b6001600160e01b031981168114611082575f80fd5b5f60208284031215611dc3575f80fd5b8135610aa481611d9e565b80356001600160a01b0381168114611de4575f80fd5b919050565b5f8083601f840112611df9575f80fd5b5081356001600160401b03811115611e0f575f80fd5b602083019150836020828501011115611e26575f80fd5b9250929050565b5f805f805f858703610100811215611e43575f80fd5b611e4c87611dce565b95506020870135945060a0603f1982011215611e66575f80fd5b5060408601925060e08601356001600160401b03811115611e85575f80fd5b611e9188828901611de9565b969995985093965092949392505050565b5f81518084525f5b81811015611ec657602081850181015186830182015201611eaa565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610aa46020830184611ea2565b5f60208284031215611f07575f80fd5b5035919050565b5f8060408385031215611f1f575f80fd5b611f2883611dce565b946020939093013593505050565b5f805f60608486031215611f48575f80fd5b611f5184611dce565b9250611f5f60208501611dce565b9150604084013590509250925092565b5f60208284031215611f7f575f80fd5b610aa482611dce565b5f8060408385031215611f99575f80fd5b50508035926020909101359150565b60ff60f81b881681525f602060e06020840152611fc860e084018a611ea2565b8381036040850152611fda818a611ea2565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825260208088019350909101905f5b8181101561202d57835183529284019291840191600101612011565b50909c9b505050505050505050505050565b5f8060408385031215612050575f80fd5b61205983611dce565b91506020830135801515811461206d575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f805f806080858703121561209f575f80fd5b6120a885611dce565b93506120b660208601611dce565b92506040850135915060608501356001600160401b03808211156120d8575f80fd5b818701915087601f8301126120eb575f80fd5b8135818111156120fd576120fd612078565b604051601f8201601f19908116603f0116810190838211818310171561212557612125612078565b816040528281528a602084870101111561213d575f80fd5b826020860160208301375f60208483010152809550505050505092959194509250565b5f60208284031215612170575f80fd5b813561ffff81168114610aa4575f80fd5b5f805f805f8086880360c0811215612197575f80fd5b8735965060208801356001600160401b03808211156121b4575f80fd5b6121c08b838c01611de9565b90985096508691506060603f19840112156121d9575f80fd5b60408a01955060a08a01359250808311156121f2575f80fd5b505061220089828a01611de9565b979a9699509497509295939492505050565b5f8060408385031215612223575f80fd5b61222c83611dce565b915061223a60208401611dce565b90509250929050565b634e487b7160e01b5f52601160045260245ffd5b5f6001820161226857612268612243565b5060010190565b6001600160401b0381168114611082575f80fd5b81358155602082013560018201556002810160408301356122a38161226f565b815460608501356122b38161226f565b60808601356122c18161226f565b6001600160401b0360801b8160801b166001600160401b0385166001600160401b0360c01b8516176fffffffffffffffff00000000000000008460401b161717855550505050505050565b600181811c9082168061232057607f821691505b60208210810361233e57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561099457805f5260205f20601f840160051c810160208510156123695750805b601f840160051c820191505b8181101561146f575f8155600101612375565b6001600160401b0383111561239f5761239f612078565b6123b3836123ad835461230c565b83612344565b5f601f8411600181146123e4575f85156123cd5750838201355b5f19600387901b1c1916600186901b17835561146f565b5f83815260208120601f198716915b8281101561241357868501358255602094850194600190920191016123f3565b508682101561242f575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b813581526020808301359082015260a0810160408301356124618161226f565b6001600160401b0390811660408401526060840135906124808261226f565b90811660608401526080840135906124978261226f565b8082166080850152505092915050565b80820281158282048414176105e8576105e8612243565b5f826124d857634e487b7160e01b5f52601260045260245ffd5b500490565b60408152826040820152828460608301375f606084830101525f6060601f19601f8601168301019050826020830152949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061254690830184611ea2565b9695505050505050565b5f60208284031215612560575f80fd5b8151610aa481611d9e565b634e487b7160e01b5f52602160045260245ffdfea26469706673582212202565532b0d3740b1ea750db24945adb8e1ed595d64ead388e48961abf356820264736f6c63430008180033
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| no internal transactions found for this address yet (traced blocks + on-demand) | ||||||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x52bc55…1234ef | 26 days agoWed, 22 Jul 2026 05:44:06 UTC | ApprovalForAll | [0] 0x000000000000…a7f70d07 [1] 0x000000000000…90eec898 data: 0x000000000000000000…00000000 |
| 0x9a01db…7853bc | 27 days agoTue, 21 Jul 2026 17:12:05 UTC | 0x6f0956…a6ed | [0] 0x000000000000…0000000a [1] 0x000000000000…0000000a [2] 0x000000000000…d7157dac |
| 0x9a01db…7853bc | 27 days agoTue, 21 Jul 2026 17:12:05 UTC | Transfer | [0] 0x000000000000…d7157dac [1] 0x000000000000…00000000 [2] 0x000000000000…0000000a |
| 0xe50eb6…c9564c | 27 days agoTue, 21 Jul 2026 17:11:40 UTC | Transfer | [0] 0x000000000000…1ad0625b [1] 0x000000000000…d7157dac [2] 0x000000000000…0000000a |
| 0x170f98…18c0cd | 27 days agoTue, 21 Jul 2026 17:11:15 UTC | 0xdc229b…5a62 | [0] 0x000000000000…0000000a [1] 0x000000000000…0000000a [2] 0x000000000000…1ad0625b data: 0xeaf971180b0cc66869…6a639cb2 |
| 0x170f98…18c0cd | 27 days agoTue, 21 Jul 2026 17:11:15 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…1ad0625b [2] 0x000000000000…0000000a |
| 0x3c9d1d…cde550 | 27 days agoTue, 21 Jul 2026 16:35:41 UTC | Transfer | [0] 0x000000000000…1ad0625b [1] 0x000000000000…c64d2a6f [2] 0x000000000000…00000009 |
| 0x67a923…9f4d3c | 27 days agoTue, 21 Jul 2026 16:29:59 UTC | Transfer | [0] 0x000000000000…d7157dac [1] 0x000000000000…1ad0625b [2] 0x000000000000…00000009 |
| 0xc3a925…3809f8 | 27 days agoTue, 21 Jul 2026 16:13:58 UTC | 0xdc229b…5a62 | [0] 0x000000000000…00000009 [1] 0x000000000000…000f4241 [2] 0x000000000000…d7157dac data: 0x5eaccc22f7b8b002de…00000000 |
| 0xc3a925…3809f8 | 27 days agoTue, 21 Jul 2026 16:13:58 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…d7157dac [2] 0x000000000000…00000009 |
| 0x8cf03e…eb0d12 | 27 days agoTue, 21 Jul 2026 16:06:58 UTC | 0xc00afa…f200 | [0] 0x000000000000…00000004 [1] 0x000000000000…d7157dac data: 0x000000000000000000…a66d19a7 |
| 0x8cf03e…eb0d12 | 27 days agoTue, 21 Jul 2026 16:06:58 UTC | Transfer | [0] 0x000000000000…d7157dac [1] 0x000000000000…00000000 [2] 0x000000000000…00000004 |
| 0x865858…d42642 | 27 days agoTue, 21 Jul 2026 16:03:22 UTC | ApprovalForAll | [0] 0x000000000000…c64d2a6f [1] 0x000000000000…90eec898 data: 0x000000000000000000…00000001 |
| 0x9211c2…b61251 | 27 days agoTue, 21 Jul 2026 16:02:16 UTC | 0xdc229b…5a62 | [0] 0x000000000000…00000008 [1] 0x000000000000…00000009 [2] 0x000000000000…c64d2a6f data: 0x6d77260b0c39ea921b…6a638c88 |
| 0x9211c2…b61251 | 27 days agoTue, 21 Jul 2026 16:02:16 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…c64d2a6f [2] 0x000000000000…00000008 |
| 0xe00c4d…781bb0 | 27 days agoTue, 21 Jul 2026 15:59:53 UTC | 0xdc229b…5a62 | [0] 0x000000000000…00000007 [1] 0x000000000000…00000008 [2] 0x000000000000…c64d2a6f data: 0x6940e1e501e0701a9e…6a638bf9 |
| 0xe00c4d…781bb0 | 27 days agoTue, 21 Jul 2026 15:59:53 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…c64d2a6f [2] 0x000000000000…00000007 |
| 0x6952c7…e34ea2 | 27 days agoTue, 21 Jul 2026 15:57:54 UTC | 0x6f0956…a6ed | [0] 0x000000000000…00000006 [1] 0x000000000000…00000007 [2] 0x000000000000…d7157dac |
| 0x6952c7…e34ea2 | 27 days agoTue, 21 Jul 2026 15:57:54 UTC | Transfer | [0] 0x000000000000…d7157dac [1] 0x000000000000…00000000 [2] 0x000000000000…00000006 |
| 0x91d019…a95c96 | 27 days agoTue, 21 Jul 2026 15:57:37 UTC | Transfer | [0] 0x000000000000…c64d2a6f [1] 0x000000000000…d7157dac [2] 0x000000000000…00000006 |
| 0x1c551a…74a270 | 27 days agoTue, 21 Jul 2026 15:55:08 UTC | 0xfbe5b6…ad03 | [0] 0x000000000000…330bfce9 [1] 0x000000000000…5a822144 |
| 0xcb018f…89f32d | 27 days agoTue, 21 Jul 2026 15:53:45 UTC | 0xdc229b…5a62 | [0] 0x000000000000…00000006 [1] 0x000000000000…00000007 [2] 0x000000000000…c64d2a6f data: 0xdf5852b763609f2edd…6a638a89 |
| 0xcb018f…89f32d | 27 days agoTue, 21 Jul 2026 15:53:45 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…c64d2a6f [2] 0x000000000000…00000006 |
| 0x8dd9e0…46b11b | 27 days agoTue, 21 Jul 2026 15:38:37 UTC | 0xdc229b…5a62 | [0] 0x000000000000…00000005 [1] 0x000000000000…00000006 [2] 0x000000000000…d7157dac data: 0x2561ff309503b330e7…6a6386f9 |
| 0x8dd9e0…46b11b | 27 days agoTue, 21 Jul 2026 15:38:37 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…d7157dac [2] 0x000000000000…00000005 |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x52bc55…1234ef | Set Approval For All | 16,183,341 | 26 days agoWed, 22 Jul 2026 05:44:06 UTC | 0x3baa…0d07 | IN | Gatching Vault | $0.000 ETH | 0.00000182 | |
| 0xe50eb6…c9564c | Safe Transfer From | 15,732,745 | 27 days agoTue, 21 Jul 2026 17:11:40 UTC | 0xf3cc…625b | IN | Gatching Vault | $0.000 ETH | 0.00000265 | |
| 0x3c9d1d…cde550 | Safe Transfer From | 15,711,182 | 27 days agoTue, 21 Jul 2026 16:35:41 UTC | 0xf3cc…625b | IN | Gatching Vault | $0.000 ETH | 0.00000261 | |
| 0x67a923…9f4d3c | Safe Transfer From | 15,707,777 | 27 days agoTue, 21 Jul 2026 16:29:59 UTC | 0x0077…7dac | IN | Gatching Vault | $0.000 ETH | 0.00000398 | |
| 0x8cf03e…eb0d12 | burnForUnwrap | 15,693,983 | 27 days agoTue, 21 Jul 2026 16:06:58 UTC | 0x0077…7dac | IN | Gatching Vault | $0.000 ETH | 0.00000261 | |
| 0x865858…d42642 | Set Approval For All | 15,691,821 | 27 days agoTue, 21 Jul 2026 16:03:22 UTC | 0x2b8f…2a6f | IN | Gatching Vault | $0.000 ETH | 0.00000291 | |
| 0x91d019…a95c96 | Safe Transfer From | 15,688,394 | 27 days agoTue, 21 Jul 2026 15:57:37 UTC | 0x2b8f…2a6f | IN | Gatching Vault | $0.000 ETH | 0.00000256 | |
| 0x1c551a…74a270 | setOperator | 15,686,900 | 27 days agoTue, 21 Jul 2026 15:55:08 UTC | 0x3b67…1884 | IN | Gatching Vault | $0.000 ETH | 0.00000193 | |
| 0x8fa3d2…6093a7 | Set Approval For All | 15,384,532 | 27 days agoTue, 21 Jul 2026 07:30:01 UTC | 0x3baa…0d07 | IN | Gatching Vault | $0.000 ETH | 0.00000268 | |
| 0xbe7d7b…b8c83c | Safe Transfer From | 15,299,764 | 27 days agoTue, 21 Jul 2026 05:08:18 UTC | 0xfdeb…3057 | IN | Gatching Vault | $0.000 ETH | 0.00000337 | |
| 0xdea8ac…be9cc4 | Set Approval For All | 15,275,446 | 27 days agoTue, 21 Jul 2026 04:27:39 UTC | 0xfdeb…3057 | IN | Gatching Vault | $0.000 ETH | 0.00000268 | |
| 0x4152f6…0bc105 | Safe Transfer From | 15,228,423 | 28 days agoTue, 21 Jul 2026 03:09:03 UTC | 0x45a3…2c9c | IN | Gatching Vault | $0.000 ETH | 0.00000339 | |
| 0x0ffdea…512e44 | Safe Transfer From | 15,224,723 | 28 days agoTue, 21 Jul 2026 03:02:52 UTC | 0x0077…7dac | IN | Gatching Vault | $0.000 ETH | 0.00000342 | |
| 0x36d0ce…cd3546 | Safe Transfer From | 15,224,659 | 28 days agoTue, 21 Jul 2026 03:02:46 UTC | 0x45a3…2c9c | IN | Gatching Vault | $0.000 ETH | 0.00000339 | |
| 0x150590…62b7e7 | Safe Transfer From | 15,206,137 | 28 days agoTue, 21 Jul 2026 02:31:48 UTC | 0x0077…7dac | IN | Gatching Vault | $0.000 ETH | 0.00000338 | |
| 0x77b3e7…2139a8 | Safe Transfer From | 15,188,414 | 28 days agoTue, 21 Jul 2026 02:02:12 UTC | 0x45a3…2c9c | IN | Gatching Vault | $0.000 ETH | 0.00000337 | |
| 0x8faea0…46b971 | Safe Transfer From | 15,170,013 | 28 days agoTue, 21 Jul 2026 01:31:29 UTC | 0x0077…7dac | IN | Gatching Vault | $0.000 ETH | 0.00000337 | |
| 0x2bc020…cbdfbc | Safe Transfer From | 15,169,961 | 28 days agoTue, 21 Jul 2026 01:31:24 UTC | 0x45a3…2c9c | IN | Gatching Vault | $0.000 ETH | 0.00000342 | |
| 0x4050d3…3a9447 | Set Approval For All | 15,123,675 | 28 days agoTue, 21 Jul 2026 00:14:03 UTC | 0x45a3…2c9c | IN | Gatching Vault | $0.000 ETH | 0.00000268 | |
| 0x90470d…7e32c8 | setCustodian | 14,926,491 | 28 days agoMon, 20 Jul 2026 18:44:49 UTC | 0x0077…7dac | IN | Gatching Vault | $0.000 ETH | 0.00000267 | |
| 0x1bde14…806969 | transferOwnership | 14,926,491 | 28 days agoMon, 20 Jul 2026 18:44:49 UTC | 0x0077…7dac | IN | Gatching Vault | $0.000 ETH | 0.00000163 | |
| 0xdf6c3a…cd9442 | setQuoteSigner | 14,926,491 | 28 days agoMon, 20 Jul 2026 18:44:49 UTC | 0x0077…7dac | IN | Gatching Vault | $0.000 ETH | 0.00000159 | |
| 0x72a1f2…0630b9 | setUnwrapFeeBps | 14,926,491 | 28 days agoMon, 20 Jul 2026 18:44:49 UTC | 0x0077…7dac | IN | Gatching Vault | $0.000 ETH | 0.00000156 | |
| 0x157f58…057a72 | setOperator | 14,926,491 | 28 days agoMon, 20 Jul 2026 18:44:49 UTC | 0x0077…7dac | IN | Gatching Vault | $0.000 ETH | 0.00000174 |