// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";
/// @title VerdantToken
/// @notice A fixed-supply ERC-20 with permit, and deliberately nothing else.
///
/// @dev What this contract is for is mostly what it refuses to be. A creator
/// launching a market is asking strangers to hold their token, and the argument
/// for doing so is that the token cannot be used against them. Concretely, and
/// permanently:
///
/// - **No mint after construction.** The entire supply is minted once, in the
/// constructor, to the deployer. There is no minting function, no minter
/// role, and no path that increases `totalSupply`.
/// - **No burn.** Not even holder-initiated. A burn function is a supply
/// surprise, and every consumer of this token — pricing, market cap,
/// circulating share — reads `totalSupply` as a constant.
/// - **No pause, no blocklist, no freeze.** Nobody can stop a transfer.
/// - **No transfer hook, no fee on transfer, no rebasing, no ERC-777 or
/// ERC-1363 callbacks.** A transfer of `n` moves exactly `n`, notifies
/// nobody, and reenters nothing.
/// - **No owner and no upgrade path.** There is no admin to compromise.
///
/// The one mutable field is `metadataURI`, and only when the creator chose
/// mutability at construction. That choice is itself immutable, and it is
/// disclosed: a token whose metadata can change is a different proposition from
/// one whose metadata cannot, and the interface shows which it is.
///
/// `VerdantToken.t.sol` asserts these absences against the compiled **ABI**
/// rather than by calling functions that do not exist, because the claim being
/// made is about the whole surface and not about the signatures someone happened
/// to think of.
///
/// Ownership of the supply: the constructor mints to `msg.sender`, which in
/// production is the factory, mid-creation, which then distributes it in the same
/// transaction — to the pool position, to the creator's vesting contract if there
/// is one, and to the creator. The token itself takes no view on that split.
contract VerdantToken is ERC20, ERC20Permit {
/// @notice The address permitted to update `metadataURI`, when that is
/// permitted at all. Not an owner: this is its only power.
address public immutable creator;
/// @notice Whether `metadataURI` can ever change. Fixed at construction.
bool public immutable metadataMutable;
/// @notice Off-chain metadata location — a logo, description, links.
/// @dev Deliberately not validated on-chain beyond length limits applied by
/// the factory. The chain cannot check that a URI resolves, and pretending to
/// would be worse than not trying.
string public metadataURI;
/// @notice Emitted on every metadata change, with both values.
/// @dev The previous value is included so an indexer can reconstruct the
/// history from events alone, which is what the interface needs to show that
/// a mutable-metadata token has been edited.
event MetadataURIUpdated(string previousURI, string newURI);
/// @notice The caller is not the creator.
error NotCreator(address caller);
/// @notice This token's metadata was fixed at construction.
error MetadataImmutable();
/// @notice A token with no supply has no market.
error ZeroSupply();
/// @notice A zero creator would strand a mutable metadata field forever.
error ZeroCreator();
/// @param totalSupply_ The whole supply, in wei. Minted to `msg.sender`.
/// @dev Parameter bounds — name and symbol lengths, supply range, URI length —
/// are enforced by the factory against the on-chain parameter register, not
/// here. This constructor checks only the two things that would produce a
/// permanently broken token rather than merely an out-of-policy one.
constructor(
string memory name_,
string memory symbol_,
uint256 totalSupply_,
address creator_,
string memory metadataURI_,
bool metadataMutable_
) ERC20(name_, symbol_) ERC20Permit(name_) {
if (totalSupply_ == 0) revert ZeroSupply();
if (creator_ == address(0)) revert ZeroCreator();
creator = creator_;
metadataMutable = metadataMutable_;
metadataURI = metadataURI_;
_mint(msg.sender, totalSupply_);
}
/// @notice Fixed at 18.
/// @dev Hard-coded rather than inherited so that it is a stated property of
/// this contract. Every price derivation in the SDK and the interface assumes
/// 18 and does not read this per token; a token with other decimals would
/// display and quote wrongly rather than fail loudly.
function decimals() public pure override returns (uint8) {
return 18;
}
/// @notice Update the metadata URI. Creator only, and only if this token was
/// created with mutable metadata.
/// @dev The immutability check precedes the authorisation check on purpose: on
/// an immutable token the reason the call fails is the token's configuration,
/// not who asked, and reporting `NotCreator` to the creator would send them
/// looking for the wrong problem.
function setMetadataURI(string calldata newURI) external {
if (!metadataMutable) revert MetadataImmutable();
if (msg.sender != creator) revert NotCreator(msg.sender);
emit MetadataURIUpdated(metadataURI, newURI);
metadataURI = newURI;
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "name_",
"type": "string",
"internalType": "string"
},
{
"name": "symbol_",
"type": "string",
"internalType": "string"
},
{
"name": "totalSupply_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "creator_",
"type": "address",
"internalType": "address"
},
{
"name": "metadataURI_",
"type": "string",
"internalType": "string"
},
{
"name": "metadataMutable_",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"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": "ERC20InsufficientAllowance",
"type": "error",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "allowance",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "needed",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC20InsufficientBalance",
"type": "error",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "balance",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "needed",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC20InvalidApprover",
"type": "error",
"inputs": [
{
"name": "approver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidReceiver",
"type": "error",
"inputs": [
{
"name": "receiver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidSender",
"type": "error",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidSpender",
"type": "error",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC2612ExpiredSignature",
"type": "error",
"inputs": [
{
"name": "deadline",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC2612InvalidSigner",
"type": "error",
"inputs": [
{
"name": "signer",
"type": "address",
"internalType": "address"
},
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "InvalidAccountNonce",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
},
{
"name": "currentNonce",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "InvalidShortString",
"type": "error",
"inputs": []
},
{
"name": "MetadataImmutable",
"type": "error",
"inputs": []
},
{
"name": "NotCreator",
"type": "error",
"inputs": [
{
"name": "caller",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "StringTooLong",
"type": "error",
"inputs": [
{
"name": "str",
"type": "string",
"internalType": "string"
}
]
},
{
"name": "ZeroCreator",
"type": "error",
"inputs": []
},
{
"name": "ZeroSupply",
"type": "error",
"inputs": []
},
{
"name": "Approval",
"type": "event",
"inputs": [
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "EIP712DomainChanged",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "MetadataURIUpdated",
"type": "event",
"inputs": [
{
"name": "previousURI",
"type": "string",
"indexed": false,
"internalType": "string"
},
{
"name": "newURI",
"type": "string",
"indexed": false,
"internalType": "string"
}
],
"anonymous": false
},
{
"name": "Transfer",
"type": "event",
"inputs": [
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "DOMAIN_SEPARATOR",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "allowance",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "approve",
"type": "function",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "balanceOf",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "creator",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "decimals",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "pure"
},
{
"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": "metadataMutable",
"type": "function",
"inputs": [],
"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": "nonces",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "permit",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "deadline",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "v",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "r",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "s",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setMetadataURI",
"type": "function",
"inputs": [
{
"name": "newURI",
"type": "string",
"internalType": "string"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "symbol",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "totalSupply",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "transfer",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "transferFrom",
"type": "function",
"inputs": [
{
"name": "from",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
}
]0x608060405234801561000f575f80fd5b5060043610610115575f3560e01c806337b767ba116100ad57806384b0196e1161007d578063a9059cbb11610063578063a9059cbb1461028d578063d505accf146102a0578063dd62ed3e146102b3575f80fd5b806384b0196e1461026a57806395d89b4114610285575f80fd5b806337b767ba146101e657806370a082311461020d578063750521f5146102425780637ecebe0014610257575f80fd5b806318160ddd116100e857806318160ddd146101aa57806323b872dd146101bc578063313ce567146101cf5780633644e515146101de575f80fd5b806302d05d3f1461011957806303ee438c1461016a57806306fdde031461017f578063095ea7b314610187575b5f80fd5b6101407f0000000000000000000000007ad3a7ae4c2fe67b2bb72b9cf67ee9f49bb46c9981565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101726102f8565b60405161016191906111a4565b610172610384565b61019a6101953660046111e5565b610414565b6040519015158152602001610161565b6002545b604051908152602001610161565b61019a6101ca36600461120d565b61042d565b60405160128152602001610161565b6101ae610450565b61019a7f000000000000000000000000000000000000000000000000000000000000000081565b6101ae61021b366004611247565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b610255610250366004611260565b61045e565b005b6101ae610265366004611247565b610579565b6102726105a3565b60405161016197969594939291906112ce565b610172610601565b61019a61029b3660046111e5565b610610565b6102556102ae36600461138d565b61061d565b6101ae6102c13660046113fa565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b600880546103059061142b565b80601f01602080910402602001604051908101604052809291908181526020018280546103319061142b565b801561037c5780601f106103535761010080835404028352916020019161037c565b820191905f5260205f20905b81548152906001019060200180831161035f57829003601f168201915b505050505081565b6060600380546103939061142b565b80601f01602080910402602001604051908101604052809291908181526020018280546103bf9061142b565b801561040a5780601f106103e15761010080835404028352916020019161040a565b820191905f5260205f20905b8154815290600101906020018083116103ed57829003601f168201915b5050505050905090565b5f336104218185856107c6565b60019150505b92915050565b5f3361043a8582856107d3565b6104458585856108a0565b506001949350505050565b5f610459610949565b905090565b7f00000000000000000000000000000000000000000000000000000000000000006104b5576040517f982c247a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000007ad3a7ae4c2fe67b2bb72b9cf67ee9f49bb46c99161461052b576040517fc66f47bf0000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b7f2c0c0e3314c3e995b16ad957a4c9b730cff6b45b142f827be3951eae381d5ff06008838360405161055f939291906114c3565b60405180910390a160086105748284836115f5565b505050565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260076020526040812054610427565b5f6060805f805f60606105b4610a7f565b6105bc610aac565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6060600480546103939061142b565b5f336104218185856108a0565b8342111561065a576040517f6279130200000000000000000000000000000000000000000000000000000000815260048101859052602401610522565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886106b28c73ffffffffffffffffffffffffffffffffffffffff165f90815260076020526040902080546001810190915590565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61071982610ad9565b90505f61072882878787610b20565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107af576040517f4b800e4600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301528b166024820152604401610522565b6107ba8a8a8a6107c6565b50505050505050505050565b6105748383836001610b4c565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461089a578181101561088c576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024810182905260448101839052606401610522565b61089a84848484035f610b4c565b50505050565b73ffffffffffffffffffffffffffffffffffffffff83166108ef576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610522565b73ffffffffffffffffffffffffffffffffffffffff821661093e576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610522565b610574838383610c91565b5f3073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ee101bcff5c75c8b092fa57c010a314d672559c8161480156109ae57507f000000000000000000000000000000000000000000000000000000000000123746145b156109d857507fa14236fdfd74f2ca969625ec756b31c0ede6f1fb21df6b155e05a5d701967b3490565b610459604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f4b0147e0f7e9ddf14c49a50ce97998009300b5136671c33a6aae889fa2f803fc918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60606104597f4861727279506f74746572526f62696e486f6f64536f6e69633130496e75001e6005610e38565b60606104597f31000000000000000000000000000000000000000000000000000000000000016006610e38565b5f610427610ae5610949565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f805f80610b3088888888610ee1565b925092509250610b408282610fd4565b50909695505050505050565b73ffffffffffffffffffffffffffffffffffffffff8416610b9b576040517fe602df050000000000000000000000000000000000000000000000000000000081525f6004820152602401610522565b73ffffffffffffffffffffffffffffffffffffffff8316610bea576040517f94280d620000000000000000000000000000000000000000000000000000000081525f6004820152602401610522565b73ffffffffffffffffffffffffffffffffffffffff8085165f908152600160209081526040808320938716835292905220829055801561089a578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610c8391815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8316610cc8578060025f828254610cbd919061170b565b90915550610d789050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610d4d576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024810182905260448101839052606401610522565b73ffffffffffffffffffffffffffffffffffffffff84165f9081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff8216610da157600280548290039055610dcc565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610e2b91815260200190565b60405180910390a3505050565b606060ff8314610e5257610e4b836110db565b9050610427565b818054610e5e9061142b565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8a9061142b565b8015610ed55780601f10610eac57610100808354040283529160200191610ed5565b820191905f5260205f20905b815481529060010190602001808311610eb857829003601f168201915b50505050509050610427565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610f1a57505f91506003905082610fca565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610f6b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116610fc157505f925060019150829050610fca565b92505f91508190505b9450945094915050565b5f826003811115610fe757610fe7611743565b03610ff0575050565b600182600381111561100457611004611743565b0361103b576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600282600381111561104f5761104f611743565b03611089576040517ffce698f700000000000000000000000000000000000000000000000000000000815260048101829052602401610522565b600382600381111561109d5761109d611743565b036110d7576040517fd78bce0c00000000000000000000000000000000000000000000000000000000815260048101829052602401610522565b5050565b60605f6110e783611118565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f60ff8216601f811115610427576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6111b66020830184611158565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146111e0575f80fd5b919050565b5f80604083850312156111f6575f80fd5b6111ff836111bd565b946020939093013593505050565b5f805f6060848603121561121f575f80fd5b611228846111bd565b9250611236602085016111bd565b929592945050506040919091013590565b5f60208284031215611257575f80fd5b6111b6826111bd565b5f8060208385031215611271575f80fd5b823567ffffffffffffffff811115611287575f80fd5b8301601f81018513611297575f80fd5b803567ffffffffffffffff8111156112ad575f80fd5b8560208284010111156112be575f80fd5b6020919091019590945092505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f61130860e0830189611158565b828103604084015261131a8189611158565b6060840188905273ffffffffffffffffffffffffffffffffffffffff8716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b8181101561137c57835183526020938401939092019160010161135e565b50909b9a5050505050505050505050565b5f805f805f805f60e0888a0312156113a3575f80fd5b6113ac886111bd565b96506113ba602089016111bd565b95506040880135945060608801359350608088013560ff811681146113dd575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f806040838503121561140b575f80fd5b611414836111bd565b9150611422602084016111bd565b90509250929050565b600181811c9082168061143f57607f821691505b602082108103611476577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b604081525f8085546114d48161142b565b806040860152600182165f81146114f2576001811461152c5761155d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083166060870152606082151560051b870101935061155d565b885f5260205f205f5b8381101561155457815488820160600152600190910190602001611535565b87016060019450505b505050828103602084015261157381858761147c565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b601f82111561057457805f5260205f20601f840160051c810160208510156115cf5750805b601f840160051c820191505b818110156115ee575f81556001016115db565b5050505050565b67ffffffffffffffff83111561160d5761160d61157d565b6116218361161b835461142b565b836115aa565b5f601f841160018114611671575f851561163b5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556115ee565b5f838152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08716915b828110156116be578685013582556020948501946001909201910161169e565b50868210156116f9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b80820180821115610427577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffdfea2646970667358221220add2986f4c7f765b02d361477d67c620e1af0a7cc81e137ef855a9ddb2737a9b64736f6c634300081a0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0xb1b769…d8e571 | 19 hrs agoMon, 17 Aug 2026 12:38:50 UTC | Transfer | [0] 0x000000000000…c8fca2d6 [1] 0x000000000000…9bb46c99 data: 0x000000000000000000…00004b77 |
| 0xb1b769…d8e571 | 19 hrs agoMon, 17 Aug 2026 12:38:50 UTC | Transfer | [0] 0x000000000000…e8a04fa7 [1] 0x000000000000…c8fca2d6 data: 0x000000000000000000…00004b77 |
| 0xb1b769…d8e571 | 19 hrs agoMon, 17 Aug 2026 12:38:50 UTC | Transfer | [0] 0x000000000000…e8a04fa7 [1] 0x000000000000…43e40951 data: 0x000000000000000000…e7ffb489 |
| 0xb1b769…d8e571 | 19 hrs agoMon, 17 Aug 2026 12:38:50 UTC | Transfer | [0] 0x000000000000…c8fca2d6 [1] 0x000000000000…e8a04fa7 data: 0x000000000000000000…e8000000 |
| 0xb1b769…d8e571 | 19 hrs agoMon, 17 Aug 2026 12:38:50 UTC | Transfer | [0] 0x000000000000…72b6d582 [1] 0x000000000000…c8fca2d6 data: 0x000000000000000000…e8000000 |
| 0xb1b769…d8e571 | 19 hrs agoMon, 17 Aug 2026 12:38:50 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…72b6d582 data: 0x000000000000000000…e8000000 |
| 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 | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| no transactions indexed for this address yet | |||||||||