Overview
ETH Balance
ETH Value
$0.00Latest 25 from a total of 17,654 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Claim Migrated C... | 188702359 | 686 days ago | IN | 0 ETH | 0.00056772 | ||||
| Transfer Ownersh... | 76563005 | 1027 days ago | IN | 0 ETH | 0.00003191 | ||||
| Claim Migrated C... | 61515546 | 1073 days ago | IN | 0 ETH | 0.00076073 | ||||
| Claim Migrated C... | 14434060 | 1321 days ago | IN | 0 ETH | 0.000589231364 ETH | ||||
| Claim Migrated C... | 14434036 | 1321 days ago | IN | 0 ETH | 0.000589240381 ETH | ||||
| Claim Migrated C... | 13563839 | 1331 days ago | IN | 0 ETH | 0.001228432932 ETH | ||||
| Claim Migrated C... | 10260327 | 1374 days ago | IN | 0 ETH | 0.000989829627 ETH | ||||
| Claim Migrated C... | 10260322 | 1374 days ago | IN | 0 ETH | 0.000960313116 ETH | ||||
| Claim Migrated C... | 10260311 | 1374 days ago | IN | 0 ETH | 0.000986818551 ETH | ||||
| Claim Migrated C... | 9766277 | 1381 days ago | IN | 0 ETH | 0.000819039399 ETH | ||||
| Claim Migrated C... | 9766267 | 1381 days ago | IN | 0 ETH | 0.000818386318 ETH | ||||
| Claim Migrated C... | 7749966 | 1414 days ago | IN | 0 ETH | 0.000529657439 ETH | ||||
| Claim Migrated C... | 7749961 | 1414 days ago | IN | 0 ETH | 0.00052966454 ETH | ||||
| Claim Migrated C... | 7749954 | 1414 days ago | IN | 0 ETH | 0.0005292342 ETH | ||||
| Claim Migrated C... | 7749920 | 1414 days ago | IN | 0 ETH | 0.000415950509 ETH | ||||
| Claim Migrated C... | 7749918 | 1414 days ago | IN | 0 ETH | 0.000416811189 ETH | ||||
| Claim Migrated C... | 7749913 | 1414 days ago | IN | 0 ETH | 0.000492617352 ETH | ||||
| Claim Migrated C... | 7749906 | 1414 days ago | IN | 0 ETH | 0.000414247364 ETH | ||||
| Claim Migrated C... | 7749895 | 1414 days ago | IN | 0 ETH | 0.000416801619 ETH | ||||
| Claim Migrated C... | 7749889 | 1414 days ago | IN | 0 ETH | 0.000416374366 ETH | ||||
| Claim Migrated C... | 7749876 | 1414 days ago | IN | 0 ETH | 0.000451574241 ETH | ||||
| Claim Migrated C... | 7749864 | 1414 days ago | IN | 0 ETH | 0.000452005816 ETH | ||||
| Claim Migrated C... | 7749851 | 1414 days ago | IN | 0 ETH | 0.000452000259 ETH | ||||
| Claim Migrated C... | 7749844 | 1414 days ago | IN | 0 ETH | 0.000451150385 ETH | ||||
| Claim Migrated C... | 6757928 | 1430 days ago | IN | 0 ETH | 0.001276445757 ETH |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 61515546 | 1073 days ago | 0 ETH | ||||
| 14434060 | 1321 days ago | 0 ETH | ||||
| 14434036 | 1321 days ago | 0 ETH | ||||
| 13563839 | 1331 days ago | 0 ETH | ||||
| 10260327 | 1374 days ago | 0 ETH | ||||
| 10260327 | 1374 days ago | 0 ETH | ||||
| 10260322 | 1374 days ago | 0 ETH | ||||
| 10260322 | 1374 days ago | 0 ETH | ||||
| 10260311 | 1374 days ago | 0 ETH | ||||
| 10260311 | 1374 days ago | 0 ETH | ||||
| 9766277 | 1381 days ago | 0 ETH | ||||
| 9766277 | 1381 days ago | 0 ETH | ||||
| 9766267 | 1381 days ago | 0 ETH | ||||
| 9766267 | 1381 days ago | 0 ETH | ||||
| 7749966 | 1414 days ago | 0 ETH | ||||
| 7749966 | 1414 days ago | 0 ETH | ||||
| 7749961 | 1414 days ago | 0 ETH | ||||
| 7749961 | 1414 days ago | 0 ETH | ||||
| 7749954 | 1414 days ago | 0 ETH | ||||
| 7749954 | 1414 days ago | 0 ETH | ||||
| 7749920 | 1414 days ago | 0 ETH | ||||
| 7749920 | 1414 days ago | 0 ETH | ||||
| 7749918 | 1414 days ago | 0 ETH | ||||
| 7749918 | 1414 days ago | 0 ETH | ||||
| 7749913 | 1414 days ago | 0 ETH |
Cross-Chain Transactions
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import '@solidstate/contracts/access/SafeOwnable.sol';
import '@solidstate/contracts/cryptography/MerkleProof.sol';
import '../CardsMint.sol';
import './CardsMerkleProofClaimStorage.sol';
contract CardsMerkleProofClaim is SafeOwnable {
event Claim(address account, uint256 tokenId, uint256 amount);
constructor() {
OwnableStorage.layout().owner = msg.sender;
}
function setIdCollections(
uint256[] calldata ids,
address[] calldata collections
) public onlyOwner {
require(
ids.length == collections.length,
'CardsMerkleProofClaim: invalid lengths'
);
mapping(uint256 => address)
storage idCollections = CardsMerkleProofClaimStorage
.layout()
.idCollections;
for (uint256 i; i < ids.length; i++) {
idCollections[ids[i]] = collections[i];
}
}
function setMigratedCardsClaimRoot(bytes32 root) external onlyOwner {
CardsMerkleProofClaimStorage.layout().root = root;
}
function hasClaimedMigratedCards(address account, uint256 id)
public
view
returns (bool)
{
return CardsMerkleProofClaimStorage.layout().claimed[account][id];
}
function validateMigratedCardsClaim(
address account,
uint256 id,
uint256 amount,
bytes32[] calldata proof
) public view returns (bool) {
bytes32 leaf = keccak256(abi.encodePacked(account, id, amount));
return
MerkleProof.verify(
proof,
CardsMerkleProofClaimStorage.layout().root,
leaf
);
}
function claimMigratedCards(
address account,
uint256 id,
uint256 amount,
bytes32[] calldata proof
) external {
require(
!hasClaimedMigratedCards(account, id),
'CardsMerkleProofClaim: already claimed'
);
require(
validateMigratedCardsClaim(account, id, amount, proof),
'CardsMerkleProofClaim: invalid proof'
);
CardsMerkleProofClaimStorage.Layout
storage l = CardsMerkleProofClaimStorage.layout();
l.claimed[account][id] = true;
CardsMint(l.idCollections[id]).mint(account, id, amount);
emit Claim(account, id, amount);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { Ownable, OwnableStorage } from './Ownable.sol';
import { SafeOwnableInternal } from './SafeOwnableInternal.sol';
import { SafeOwnableStorage } from './SafeOwnableStorage.sol';
/**
* @title Ownership access control based on ERC173 with ownership transfer safety check
*/
abstract contract SafeOwnable is Ownable, SafeOwnableInternal {
using OwnableStorage for OwnableStorage.Layout;
using SafeOwnableStorage for SafeOwnableStorage.Layout;
function nomineeOwner() public view virtual returns (address) {
return SafeOwnableStorage.layout().nomineeOwner;
}
/**
* @inheritdoc Ownable
* @dev ownership transfer must be accepted by beneficiary before transfer is complete
*/
function transferOwnership(address account)
public
virtual
override
onlyOwner
{
SafeOwnableStorage.layout().setNomineeOwner(account);
}
/**
* @notice accept transfer of contract ownership
*/
function acceptOwnership() public virtual onlyNomineeOwner {
OwnableStorage.Layout storage l = OwnableStorage.layout();
emit OwnershipTransferred(l.owner, msg.sender);
l.setOwner(msg.sender);
SafeOwnableStorage.layout().setNomineeOwner(address(0));
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @title Merkle tree verification utility
* @dev derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT license)
*/
library MerkleProof {
/**
* @notice verify whether given leaf is contained within Merkle tree defined by given root
* @param proof proof that Merkle tree contains given leaf
* @param root Merkle tree root
* @param leaf element whose presence in Merkle tree to prove
* @return whether leaf is proven to be contained within Merkle tree defined by root
*/
function verify(
bytes32[] memory proof,
bytes32 root,
bytes32 leaf
) internal pure returns (bool) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
bytes32 proofElement = proof[i];
if (computedHash <= proofElement) {
computedHash = keccak256(
abi.encodePacked(computedHash, proofElement)
);
} else {
computedHash = keccak256(
abi.encodePacked(proofElement, computedHash)
);
}
}
return computedHash == root;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import '@solidstate/contracts/access/OwnableInternal.sol';
import '@solidstate/contracts/token/ERC1155/enumerable/ERC1155EnumerableInternal.sol';
import './CardsMintStorage.sol';
contract CardsMint is ERC1155EnumerableInternal, OwnableInternal {
function mint(
address account,
uint256 tokenId,
uint256 amount
) external {
require(
CardsMintStorage.layout().minters[msg.sender],
'CardsMint: unauthorized minter'
);
_mint(account, tokenId, amount, '');
}
function addMinter(address account) external onlyOwner {
CardsMintStorage.layout().minters[account] = true;
}
function removeMinter(address account) external onlyOwner {
CardsMintStorage.layout().minters[account] = false;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
library CardsMerkleProofClaimStorage {
struct Layout {
bytes32 root;
mapping(address => mapping(uint256 => bool)) claimed;
mapping(uint256 => address) idCollections;
}
bytes32 internal constant STORAGE_SLOT =
keccak256('treasure.contracts.storage.CardsMerkleProofClaim');
function layout() internal pure returns (Layout storage l) {
bytes32 slot = STORAGE_SLOT;
assembly {
l.slot := slot
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { IERC173 } from './IERC173.sol';
import { OwnableInternal } from './OwnableInternal.sol';
import { OwnableStorage } from './OwnableStorage.sol';
/**
* @title Ownership access control based on ERC173
*/
abstract contract Ownable is IERC173, OwnableInternal {
using OwnableStorage for OwnableStorage.Layout;
/**
* @inheritdoc IERC173
*/
function owner() public view virtual override returns (address) {
return OwnableStorage.layout().owner;
}
/**
* @inheritdoc IERC173
*/
function transferOwnership(address account)
public
virtual
override
onlyOwner
{
OwnableStorage.layout().setOwner(account);
emit OwnershipTransferred(msg.sender, account);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { SafeOwnableStorage } from './SafeOwnableStorage.sol';
abstract contract SafeOwnableInternal {
using SafeOwnableStorage for SafeOwnableStorage.Layout;
modifier onlyNomineeOwner() {
require(
msg.sender == SafeOwnableStorage.layout().nomineeOwner,
'SafeOwnable: sender must be nominee owner'
);
_;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
library SafeOwnableStorage {
struct Layout {
address nomineeOwner;
}
bytes32 internal constant STORAGE_SLOT =
keccak256('solidstate.contracts.storage.SafeOwnable');
function layout() internal pure returns (Layout storage l) {
bytes32 slot = STORAGE_SLOT;
assembly {
l.slot := slot
}
}
function setNomineeOwner(Layout storage l, address nomineeOwner) internal {
l.nomineeOwner = nomineeOwner;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @title Contract ownership standard interface
* @dev see https://eips.ethereum.org/EIPS/eip-173
*/
interface IERC173 {
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
/**
* @notice get the ERC173 contract owner
* @return conract owner
*/
function owner() external view returns (address);
/**
* @notice transfer contract ownership to new account
* @param account address of new owner
*/
function transferOwnership(address account) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { OwnableStorage } from './OwnableStorage.sol';
abstract contract OwnableInternal {
using OwnableStorage for OwnableStorage.Layout;
modifier onlyOwner() {
require(
msg.sender == OwnableStorage.layout().owner,
'Ownable: sender must be owner'
);
_;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
library OwnableStorage {
struct Layout {
address owner;
}
bytes32 internal constant STORAGE_SLOT =
keccak256('solidstate.contracts.storage.Ownable');
function layout() internal pure returns (Layout storage l) {
bytes32 slot = STORAGE_SLOT;
assembly {
l.slot := slot
}
}
function setOwner(Layout storage l, address owner) internal {
l.owner = owner;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { EnumerableSet } from '../../../utils/EnumerableSet.sol';
import { ERC1155BaseInternal, ERC1155BaseStorage } from '../base/ERC1155BaseInternal.sol';
import { ERC1155EnumerableStorage } from './ERC1155EnumerableStorage.sol';
/**
* @title ERC1155Enumerable internal functions
*/
abstract contract ERC1155EnumerableInternal is ERC1155BaseInternal {
using EnumerableSet for EnumerableSet.AddressSet;
using EnumerableSet for EnumerableSet.UintSet;
/**
* @notice ERC1155 hook: update aggregate values
* @inheritdoc ERC1155BaseInternal
*/
function _beforeTokenTransfer(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual override {
super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
if (from != to) {
ERC1155EnumerableStorage.Layout storage l = ERC1155EnumerableStorage
.layout();
mapping(uint256 => EnumerableSet.AddressSet)
storage tokenAccounts = l.accountsByToken;
EnumerableSet.UintSet storage fromTokens = l.tokensByAccount[from];
EnumerableSet.UintSet storage toTokens = l.tokensByAccount[to];
for (uint256 i; i < ids.length; i++) {
uint256 amount = amounts[i];
if (amount > 0) {
uint256 id = ids[i];
if (from == address(0)) {
l.totalSupply[id] += amount;
} else if (_balanceOf(from, id) == amount) {
tokenAccounts[id].remove(from);
fromTokens.remove(id);
}
if (to == address(0)) {
l.totalSupply[id] -= amount;
} else if (_balanceOf(to, id) == 0) {
tokenAccounts[id].add(to);
toTokens.add(id);
}
}
}
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
library CardsMintStorage {
struct Layout {
mapping(address => bool) minters;
}
bytes32 internal constant STORAGE_SLOT =
keccak256('treasure.contracts.storage.CardsMint');
function layout() internal pure returns (Layout storage l) {
bytes32 slot = STORAGE_SLOT;
assembly {
l.slot := slot
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @title Set implementation with enumeration functions
* @dev derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT license)
*/
library EnumerableSet {
struct Set {
bytes32[] _values;
// 1-indexed to allow 0 to signify nonexistence
mapping(bytes32 => uint256) _indexes;
}
struct Bytes32Set {
Set _inner;
}
struct AddressSet {
Set _inner;
}
struct UintSet {
Set _inner;
}
function at(Bytes32Set storage set, uint256 index)
internal
view
returns (bytes32)
{
return _at(set._inner, index);
}
function at(AddressSet storage set, uint256 index)
internal
view
returns (address)
{
return address(uint160(uint256(_at(set._inner, index))));
}
function at(UintSet storage set, uint256 index)
internal
view
returns (uint256)
{
return uint256(_at(set._inner, index));
}
function contains(Bytes32Set storage set, bytes32 value)
internal
view
returns (bool)
{
return _contains(set._inner, value);
}
function contains(AddressSet storage set, address value)
internal
view
returns (bool)
{
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
function contains(UintSet storage set, uint256 value)
internal
view
returns (bool)
{
return _contains(set._inner, bytes32(value));
}
function indexOf(Bytes32Set storage set, bytes32 value)
internal
view
returns (uint256)
{
return _indexOf(set._inner, value);
}
function indexOf(AddressSet storage set, address value)
internal
view
returns (uint256)
{
return _indexOf(set._inner, bytes32(uint256(uint160(value))));
}
function indexOf(UintSet storage set, uint256 value)
internal
view
returns (uint256)
{
return _indexOf(set._inner, bytes32(value));
}
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
function add(Bytes32Set storage set, bytes32 value)
internal
returns (bool)
{
return _add(set._inner, value);
}
function add(AddressSet storage set, address value)
internal
returns (bool)
{
return _add(set._inner, bytes32(uint256(uint160(value))));
}
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
function remove(Bytes32Set storage set, bytes32 value)
internal
returns (bool)
{
return _remove(set._inner, value);
}
function remove(AddressSet storage set, address value)
internal
returns (bool)
{
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
function remove(UintSet storage set, uint256 value)
internal
returns (bool)
{
return _remove(set._inner, bytes32(value));
}
function _at(Set storage set, uint256 index)
private
view
returns (bytes32)
{
require(
set._values.length > index,
'EnumerableSet: index out of bounds'
);
return set._values[index];
}
function _contains(Set storage set, bytes32 value)
private
view
returns (bool)
{
return set._indexes[value] != 0;
}
function _indexOf(Set storage set, bytes32 value)
private
view
returns (uint256)
{
unchecked {
return set._indexes[value] - 1;
}
}
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
function _remove(Set storage set, bytes32 value) private returns (bool) {
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) {
uint256 index = valueIndex - 1;
bytes32 last = set._values[set._values.length - 1];
// move last value to now-vacant index
set._values[index] = last;
set._indexes[last] = index + 1;
// clear last index
set._values.pop();
delete set._indexes[value];
return true;
} else {
return false;
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { AddressUtils } from '../../../utils/AddressUtils.sol';
import { IERC1155Internal } from '../IERC1155Internal.sol';
import { IERC1155Receiver } from '../IERC1155Receiver.sol';
import { ERC1155BaseStorage } from './ERC1155BaseStorage.sol';
/**
* @title Base ERC1155 internal functions
* @dev derived from https://github.com/OpenZeppelin/openzeppelin-contracts/ (MIT license)
*/
abstract contract ERC1155BaseInternal is IERC1155Internal {
using AddressUtils for address;
/**
* @notice query the balance of given token held by given address
* @param account address to query
* @param id token to query
* @return token balance
*/
function _balanceOf(address account, uint256 id)
internal
view
virtual
returns (uint256)
{
require(
account != address(0),
'ERC1155: balance query for the zero address'
);
return ERC1155BaseStorage.layout().balances[id][account];
}
/**
* @notice mint given quantity of tokens for given address
* @dev ERC1155Receiver implementation is not checked
* @param account beneficiary of minting
* @param id token ID
* @param amount quantity of tokens to mint
* @param data data payload
*/
function _mint(
address account,
uint256 id,
uint256 amount,
bytes memory data
) internal virtual {
require(account != address(0), 'ERC1155: mint to the zero address');
_beforeTokenTransfer(
msg.sender,
address(0),
account,
_asSingletonArray(id),
_asSingletonArray(amount),
data
);
mapping(address => uint256) storage balances = ERC1155BaseStorage
.layout()
.balances[id];
balances[account] += amount;
emit TransferSingle(msg.sender, address(0), account, id, amount);
}
/**
* @notice mint given quantity of tokens for given address
* @param account beneficiary of minting
* @param id token ID
* @param amount quantity of tokens to mint
* @param data data payload
*/
function _safeMint(
address account,
uint256 id,
uint256 amount,
bytes memory data
) internal virtual {
_doSafeTransferAcceptanceCheck(
msg.sender,
address(0),
account,
id,
amount,
data
);
_mint(account, id, amount, data);
}
/**
* @notice mint batch of tokens for given address
* @dev ERC1155Receiver implementation is not checked
* @param account beneficiary of minting
* @param ids list of token IDs
* @param amounts list of quantities of tokens to mint
* @param data data payload
*/
function _mintBatch(
address account,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {
require(account != address(0), 'ERC1155: mint to the zero address');
require(
ids.length == amounts.length,
'ERC1155: ids and amounts length mismatch'
);
_beforeTokenTransfer(
msg.sender,
address(0),
account,
ids,
amounts,
data
);
mapping(uint256 => mapping(address => uint256))
storage balances = ERC1155BaseStorage.layout().balances;
for (uint256 i; i < ids.length; i++) {
balances[ids[i]][account] += amounts[i];
}
emit TransferBatch(msg.sender, address(0), account, ids, amounts);
}
/**
* @notice mint batch of tokens for given address
* @param account beneficiary of minting
* @param ids list of token IDs
* @param amounts list of quantities of tokens to mint
* @param data data payload
*/
function _safeMintBatch(
address account,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {
_doSafeBatchTransferAcceptanceCheck(
msg.sender,
address(0),
account,
ids,
amounts,
data
);
_mintBatch(account, ids, amounts, data);
}
/**
* @notice burn given quantity of tokens held by given address
* @param account holder of tokens to burn
* @param id token ID
* @param amount quantity of tokens to burn
*/
function _burn(
address account,
uint256 id,
uint256 amount
) internal virtual {
require(account != address(0), 'ERC1155: burn from the zero address');
_beforeTokenTransfer(
msg.sender,
account,
address(0),
_asSingletonArray(id),
_asSingletonArray(amount),
''
);
mapping(address => uint256) storage balances = ERC1155BaseStorage
.layout()
.balances[id];
unchecked {
require(
balances[account] >= amount,
'ERC1155: burn amount exceeds balances'
);
balances[account] -= amount;
}
emit TransferSingle(msg.sender, account, address(0), id, amount);
}
/**
* @notice burn given batch of tokens held by given address
* @param account holder of tokens to burn
* @param ids token IDs
* @param amounts quantities of tokens to burn
*/
function _burnBatch(
address account,
uint256[] memory ids,
uint256[] memory amounts
) internal virtual {
require(account != address(0), 'ERC1155: burn from the zero address');
require(
ids.length == amounts.length,
'ERC1155: ids and amounts length mismatch'
);
_beforeTokenTransfer(msg.sender, account, address(0), ids, amounts, '');
mapping(uint256 => mapping(address => uint256))
storage balances = ERC1155BaseStorage.layout().balances;
unchecked {
for (uint256 i; i < ids.length; i++) {
uint256 id = ids[i];
require(
balances[id][account] >= amounts[i],
'ERC1155: burn amount exceeds balance'
);
balances[id][account] -= amounts[i];
}
}
emit TransferBatch(msg.sender, account, address(0), ids, amounts);
}
/**
* @notice transfer tokens between given addresses
* @dev ERC1155Receiver implementation is not checked
* @param operator executor of transfer
* @param sender sender of tokens
* @param recipient receiver of tokens
* @param id token ID
* @param amount quantity of tokens to transfer
* @param data data payload
*/
function _transfer(
address operator,
address sender,
address recipient,
uint256 id,
uint256 amount,
bytes memory data
) internal virtual {
require(
recipient != address(0),
'ERC1155: transfer to the zero address'
);
_beforeTokenTransfer(
operator,
sender,
recipient,
_asSingletonArray(id),
_asSingletonArray(amount),
data
);
mapping(uint256 => mapping(address => uint256))
storage balances = ERC1155BaseStorage.layout().balances;
unchecked {
uint256 senderBalance = balances[id][sender];
require(
senderBalance >= amount,
'ERC1155: insufficient balances for transfer'
);
balances[id][sender] = senderBalance - amount;
}
balances[id][recipient] += amount;
emit TransferSingle(operator, sender, recipient, id, amount);
}
/**
* @notice transfer tokens between given addresses
* @param operator executor of transfer
* @param sender sender of tokens
* @param recipient receiver of tokens
* @param id token ID
* @param amount quantity of tokens to transfer
* @param data data payload
*/
function _safeTransfer(
address operator,
address sender,
address recipient,
uint256 id,
uint256 amount,
bytes memory data
) internal virtual {
_doSafeTransferAcceptanceCheck(
operator,
sender,
recipient,
id,
amount,
data
);
_transfer(operator, sender, recipient, id, amount, data);
}
/**
* @notice transfer batch of tokens between given addresses
* @dev ERC1155Receiver implementation is not checked
* @param operator executor of transfer
* @param sender sender of tokens
* @param recipient receiver of tokens
* @param ids token IDs
* @param amounts quantities of tokens to transfer
* @param data data payload
*/
function _transferBatch(
address operator,
address sender,
address recipient,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {
require(
recipient != address(0),
'ERC1155: transfer to the zero address'
);
require(
ids.length == amounts.length,
'ERC1155: ids and amounts length mismatch'
);
_beforeTokenTransfer(operator, sender, recipient, ids, amounts, data);
mapping(uint256 => mapping(address => uint256))
storage balances = ERC1155BaseStorage.layout().balances;
for (uint256 i; i < ids.length; i++) {
uint256 token = ids[i];
uint256 amount = amounts[i];
unchecked {
uint256 senderBalance = balances[token][sender];
require(
senderBalance >= amount,
'ERC1155: insufficient balances for transfer'
);
balances[token][sender] = senderBalance - amount;
}
balances[token][recipient] += amount;
}
emit TransferBatch(operator, sender, recipient, ids, amounts);
}
/**
* @notice transfer batch of tokens between given addresses
* @param operator executor of transfer
* @param sender sender of tokens
* @param recipient receiver of tokens
* @param ids token IDs
* @param amounts quantities of tokens to transfer
* @param data data payload
*/
function _safeTransferBatch(
address operator,
address sender,
address recipient,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {
_doSafeBatchTransferAcceptanceCheck(
operator,
sender,
recipient,
ids,
amounts,
data
);
_transferBatch(operator, sender, recipient, ids, amounts, data);
}
/**
* @notice wrap given element in array of length 1
* @param element element to wrap
* @return singleton array
*/
function _asSingletonArray(uint256 element)
private
pure
returns (uint256[] memory)
{
uint256[] memory array = new uint256[](1);
array[0] = element;
return array;
}
/**
* @notice revert if applicable transfer recipient is not valid ERC1155Receiver
* @param operator executor of transfer
* @param from sender of tokens
* @param to receiver of tokens
* @param id token ID
* @param amount quantity of tokens to transfer
* @param data data payload
*/
function _doSafeTransferAcceptanceCheck(
address operator,
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
) private {
if (to.isContract()) {
try
IERC1155Receiver(to).onERC1155Received(
operator,
from,
id,
amount,
data
)
returns (bytes4 response) {
require(
response == IERC1155Receiver.onERC1155Received.selector,
'ERC1155: ERC1155Receiver rejected tokens'
);
} catch Error(string memory reason) {
revert(reason);
} catch {
revert('ERC1155: transfer to non ERC1155Receiver implementer');
}
}
}
/**
* @notice revert if applicable transfer recipient is not valid ERC1155Receiver
* @param operator executor of transfer
* @param from sender of tokens
* @param to receiver of tokens
* @param ids token IDs
* @param amounts quantities of tokens to transfer
* @param data data payload
*/
function _doSafeBatchTransferAcceptanceCheck(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) private {
if (to.isContract()) {
try
IERC1155Receiver(to).onERC1155BatchReceived(
operator,
from,
ids,
amounts,
data
)
returns (bytes4 response) {
require(
response ==
IERC1155Receiver.onERC1155BatchReceived.selector,
'ERC1155: ERC1155Receiver rejected tokens'
);
} catch Error(string memory reason) {
revert(reason);
} catch {
revert('ERC1155: transfer to non ERC1155Receiver implementer');
}
}
}
/**
* @notice ERC1155 hook, called before all transfers including mint and burn
* @dev function should be overridden and new implementation must call super
* @dev called for both single and batch transfers
* @param operator executor of transfer
* @param from sender of tokens
* @param to receiver of tokens
* @param ids token IDs
* @param amounts quantities of tokens to transfer
* @param data data payload
*/
function _beforeTokenTransfer(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { EnumerableSet } from '../../../utils/EnumerableSet.sol';
library ERC1155EnumerableStorage {
struct Layout {
mapping(uint256 => uint256) totalSupply;
mapping(uint256 => EnumerableSet.AddressSet) accountsByToken;
mapping(address => EnumerableSet.UintSet) tokensByAccount;
}
bytes32 internal constant STORAGE_SLOT =
keccak256('solidstate.contracts.storage.ERC1155Enumerable');
function layout() internal pure returns (Layout storage l) {
bytes32 slot = STORAGE_SLOT;
assembly {
l.slot := slot
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
library AddressUtils {
function toString(address account) internal pure returns (string memory) {
bytes32 value = bytes32(uint256(uint160(account)));
bytes memory alphabet = '0123456789abcdef';
bytes memory chars = new bytes(42);
chars[0] = '0';
chars[1] = 'x';
for (uint256 i = 0; i < 20; i++) {
chars[2 + i * 2] = alphabet[uint8(value[i + 12] >> 4)];
chars[3 + i * 2] = alphabet[uint8(value[i + 12] & 0x0f)];
}
return string(chars);
}
function isContract(address account) internal view returns (bool) {
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
function sendValue(address payable account, uint256 amount) internal {
(bool success, ) = account.call{ value: amount }('');
require(success, 'AddressUtils: failed to send value');
}
function functionCall(address target, bytes memory data)
internal
returns (bytes memory)
{
return
functionCall(target, data, 'AddressUtils: failed low-level call');
}
function functionCall(
address target,
bytes memory data,
string memory error
) internal returns (bytes memory) {
return _functionCallWithValue(target, data, 0, error);
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return
functionCallWithValue(
target,
data,
value,
'AddressUtils: failed low-level call with value'
);
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory error
) internal returns (bytes memory) {
require(
address(this).balance >= value,
'AddressUtils: insufficient balance for call'
);
return _functionCallWithValue(target, data, value, error);
}
function _functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory error
) private returns (bytes memory) {
require(
isContract(target),
'AddressUtils: function call to non-contract'
);
(bool success, bytes memory returnData) = target.call{ value: value }(
data
);
if (success) {
return returnData;
} else if (returnData.length > 0) {
assembly {
let returnData_size := mload(returnData)
revert(add(32, returnData), returnData_size)
}
} else {
revert(error);
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { IERC165 } from '../../introspection/IERC165.sol';
/**
* @notice Partial ERC1155 interface needed by internal functions
*/
interface IERC1155Internal {
event TransferSingle(
address indexed operator,
address indexed from,
address indexed to,
uint256 id,
uint256 value
);
event TransferBatch(
address indexed operator,
address indexed from,
address indexed to,
uint256[] ids,
uint256[] values
);
event ApprovalForAll(
address indexed account,
address indexed operator,
bool approved
);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { IERC165 } from '../../introspection/IERC165.sol';
/**
* @title ERC1155 transfer receiver interface
*/
interface IERC1155Receiver is IERC165 {
/**
* @notice validate receipt of ERC1155 transfer
* @param operator executor of transfer
* @param from sender of tokens
* @param id token ID received
* @param value quantity of tokens received
* @param data data payload
* @return function's own selector if transfer is accepted
*/
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
) external returns (bytes4);
/**
* @notice validate receipt of ERC1155 batch transfer
* @param operator executor of transfer
* @param from sender of tokens
* @param ids token IDs received
* @param values quantities of tokens received
* @param data data payload
* @return function's own selector if transfer is accepted
*/
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
) external returns (bytes4);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
library ERC1155BaseStorage {
struct Layout {
mapping(uint256 => mapping(address => uint256)) balances;
mapping(address => mapping(address => bool)) operatorApprovals;
}
bytes32 internal constant STORAGE_SLOT =
keccak256('solidstate.contracts.storage.ERC1155Base');
function layout() internal pure returns (Layout storage l) {
bytes32 slot = STORAGE_SLOT;
assembly {
l.slot := slot
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @title ERC165 interface registration interface
* @dev see https://eips.ethereum.org/EIPS/eip-165
*/
interface IERC165 {
/**
* @notice query whether contract has registered support for given interface
* @param interfaceId interface id
* @return bool whether interface is supported
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"claimMigratedCards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"hasClaimedMigratedCards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nomineeOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"address[]","name":"collections","type":"address[]"}],"name":"setIdCollections","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setMigratedCardsClaimRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"validateMigratedCardsClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b503361002461004760201b61078c1760201c565b80546001600160a01b0319166001600160a01b039290921691909117905561006b565b7f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f67168046090565b610adc8061007a6000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c80638da5cb5b116100665780638da5cb5b146100fd5780639253e50f14610105578063a6ede02b14610118578063a91c55261461012b578063f2fde38b1461013e57600080fd5b80630789ce8914610098578063688cfc66146100ad57806379ba5097146100d55780638ab5150a146100dd575b600080fd5b6100ab6100a63660046109a7565b610151565b005b6100c06100bb366004610941565b6102c0565b60405190151581526020015b60405180910390f35b6100ab61035c565b6100e5610461565b6040516001600160a01b0390911681526020016100cc565b6100e5610482565b6100ab610113366004610941565b61048c565b6100c0610126366004610918565b6106a6565b6100ab610139366004610a10565b6106f0565b6100ab61014c3660046108f7565b610744565b61015961078c565b546001600160a01b0316331461018a5760405162461bcd60e51b815260040161018190610a28565b60405180910390fd5b8281146101e85760405162461bcd60e51b815260206004820152602660248201527f43617264734d65726b6c6550726f6f66436c61696d3a20696e76616c6964206c604482015265656e6774687360d01b6064820152608401610181565b7f8b709c7112bdc61083dc731c7c8b862deebc9e7ddb3dfaf82970b150a88452a960005b848110156102b85783838281811061023457634e487b7160e01b600052603260045260246000fd5b905060200201602081019061024991906108f7565b82600088888581811061026c57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080806102b090610a5f565b91505061020c565b505050505050565b6040516bffffffffffffffffffffffff19606087901b1660208201526034810185905260548101849052600090819060740160405160208183030381529060405280519060200120905061035184848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061034a92506107b0915050565b54836107d4565b979650505050505050565b600080516020610a87833981519152546001600160a01b031633146103d55760405162461bcd60e51b815260206004820152602960248201527f536166654f776e61626c653a2073656e646572206d757374206265206e6f6d696044820152683732b29037bbb732b960b91b6064820152608401610181565b60006103df61078c565b805460405191925033916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a380546001600160a01b0319163317815561045e6000600080516020610a878339815191525b9081546001600160a01b0319166001600160a01b0391909116179055565b50565b6000600080516020610a878339815191525b546001600160a01b0316919050565b600061047361078c565b61049685856106a6565b156104f25760405162461bcd60e51b815260206004820152602660248201527f43617264734d65726b6c6550726f6f66436c61696d3a20616c726561647920636044820152651b185a5b595960d21b6064820152608401610181565b6104ff85858585856102c0565b6105575760405162461bcd60e51b8152602060048201526024808201527f43617264734d65726b6c6550726f6f66436c61696d3a20696e76616c696420706044820152633937b7b360e11b6064820152608401610181565b6001600160a01b0385811660008181527f8b709c7112bdc61083dc731c7c8b862deebc9e7ddb3dfaf82970b150a88452a8602090815260408083208984528252808320805460ff191660011790557f8b709c7112bdc61083dc731c7c8b862deebc9e7ddb3dfaf82970b150a88452a9909152808220548151630ab714fb60e11b81526004810194909452602484018990526044840188905290517f8b709c7112bdc61083dc731c7c8b862deebc9e7ddb3dfaf82970b150a88452a794919091169263156e29f692606480830193919282900301818387803b15801561063b57600080fd5b505af115801561064f573d6000803e3d6000fd5b5050604080516001600160a01b038a168152602081018990529081018790527f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf79250606001905060405180910390a1505050505050565b6001600160a01b039190911660009081527f8b709c7112bdc61083dc731c7c8b862deebc9e7ddb3dfaf82970b150a88452a860209081526040808320938352929052205460ff1690565b6106f861078c565b546001600160a01b031633146107205760405162461bcd60e51b815260040161018190610a28565b7f8b709c7112bdc61083dc731c7c8b862deebc9e7ddb3dfaf82970b150a88452a755565b61074c61078c565b546001600160a01b031633146107745760405162461bcd60e51b815260040161018190610a28565b61045e81600080516020610a87833981519152610440565b7f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f67168046090565b7f8b709c7112bdc61083dc731c7c8b862deebc9e7ddb3dfaf82970b150a88452a790565b600081815b855181101561088657600086828151811061080457634e487b7160e01b600052603260045260246000fd5b60200260200101519050808311610846576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250610873565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061087e81610a5f565b9150506107d9565b509092149392505050565b80356001600160a01b03811681146108a857600080fd5b919050565b60008083601f8401126108be578182fd5b50813567ffffffffffffffff8111156108d5578182fd5b6020830191508360208260051b85010111156108f057600080fd5b9250929050565b600060208284031215610908578081fd5b61091182610891565b9392505050565b6000806040838503121561092a578081fd5b61093383610891565b946020939093013593505050565b600080600080600060808688031215610958578081fd5b61096186610891565b94506020860135935060408601359250606086013567ffffffffffffffff81111561098a578182fd5b610996888289016108ad565b969995985093965092949392505050565b600080600080604085870312156109bc578384fd5b843567ffffffffffffffff808211156109d3578586fd5b6109df888389016108ad565b909650945060208701359150808211156109f7578384fd5b50610a04878288016108ad565b95989497509550505050565b600060208284031215610a21578081fd5b5035919050565b6020808252601d908201527f4f776e61626c653a2073656e646572206d757374206265206f776e6572000000604082015260600190565b6000600019821415610a7f57634e487b7160e01b81526011600452602481fd5b506001019056fe24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce6617890a2646970667358221220cb2ed2ee0a705f147a31ae442179693a05e37fecc5d931e5673016c6d2eb9bf064736f6c63430008040033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100935760003560e01c80638da5cb5b116100665780638da5cb5b146100fd5780639253e50f14610105578063a6ede02b14610118578063a91c55261461012b578063f2fde38b1461013e57600080fd5b80630789ce8914610098578063688cfc66146100ad57806379ba5097146100d55780638ab5150a146100dd575b600080fd5b6100ab6100a63660046109a7565b610151565b005b6100c06100bb366004610941565b6102c0565b60405190151581526020015b60405180910390f35b6100ab61035c565b6100e5610461565b6040516001600160a01b0390911681526020016100cc565b6100e5610482565b6100ab610113366004610941565b61048c565b6100c0610126366004610918565b6106a6565b6100ab610139366004610a10565b6106f0565b6100ab61014c3660046108f7565b610744565b61015961078c565b546001600160a01b0316331461018a5760405162461bcd60e51b815260040161018190610a28565b60405180910390fd5b8281146101e85760405162461bcd60e51b815260206004820152602660248201527f43617264734d65726b6c6550726f6f66436c61696d3a20696e76616c6964206c604482015265656e6774687360d01b6064820152608401610181565b7f8b709c7112bdc61083dc731c7c8b862deebc9e7ddb3dfaf82970b150a88452a960005b848110156102b85783838281811061023457634e487b7160e01b600052603260045260246000fd5b905060200201602081019061024991906108f7565b82600088888581811061026c57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080806102b090610a5f565b91505061020c565b505050505050565b6040516bffffffffffffffffffffffff19606087901b1660208201526034810185905260548101849052600090819060740160405160208183030381529060405280519060200120905061035184848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061034a92506107b0915050565b54836107d4565b979650505050505050565b600080516020610a87833981519152546001600160a01b031633146103d55760405162461bcd60e51b815260206004820152602960248201527f536166654f776e61626c653a2073656e646572206d757374206265206e6f6d696044820152683732b29037bbb732b960b91b6064820152608401610181565b60006103df61078c565b805460405191925033916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a380546001600160a01b0319163317815561045e6000600080516020610a878339815191525b9081546001600160a01b0319166001600160a01b0391909116179055565b50565b6000600080516020610a878339815191525b546001600160a01b0316919050565b600061047361078c565b61049685856106a6565b156104f25760405162461bcd60e51b815260206004820152602660248201527f43617264734d65726b6c6550726f6f66436c61696d3a20616c726561647920636044820152651b185a5b595960d21b6064820152608401610181565b6104ff85858585856102c0565b6105575760405162461bcd60e51b8152602060048201526024808201527f43617264734d65726b6c6550726f6f66436c61696d3a20696e76616c696420706044820152633937b7b360e11b6064820152608401610181565b6001600160a01b0385811660008181527f8b709c7112bdc61083dc731c7c8b862deebc9e7ddb3dfaf82970b150a88452a8602090815260408083208984528252808320805460ff191660011790557f8b709c7112bdc61083dc731c7c8b862deebc9e7ddb3dfaf82970b150a88452a9909152808220548151630ab714fb60e11b81526004810194909452602484018990526044840188905290517f8b709c7112bdc61083dc731c7c8b862deebc9e7ddb3dfaf82970b150a88452a794919091169263156e29f692606480830193919282900301818387803b15801561063b57600080fd5b505af115801561064f573d6000803e3d6000fd5b5050604080516001600160a01b038a168152602081018990529081018790527f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf79250606001905060405180910390a1505050505050565b6001600160a01b039190911660009081527f8b709c7112bdc61083dc731c7c8b862deebc9e7ddb3dfaf82970b150a88452a860209081526040808320938352929052205460ff1690565b6106f861078c565b546001600160a01b031633146107205760405162461bcd60e51b815260040161018190610a28565b7f8b709c7112bdc61083dc731c7c8b862deebc9e7ddb3dfaf82970b150a88452a755565b61074c61078c565b546001600160a01b031633146107745760405162461bcd60e51b815260040161018190610a28565b61045e81600080516020610a87833981519152610440565b7f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f67168046090565b7f8b709c7112bdc61083dc731c7c8b862deebc9e7ddb3dfaf82970b150a88452a790565b600081815b855181101561088657600086828151811061080457634e487b7160e01b600052603260045260246000fd5b60200260200101519050808311610846576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250610873565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061087e81610a5f565b9150506107d9565b509092149392505050565b80356001600160a01b03811681146108a857600080fd5b919050565b60008083601f8401126108be578182fd5b50813567ffffffffffffffff8111156108d5578182fd5b6020830191508360208260051b85010111156108f057600080fd5b9250929050565b600060208284031215610908578081fd5b61091182610891565b9392505050565b6000806040838503121561092a578081fd5b61093383610891565b946020939093013593505050565b600080600080600060808688031215610958578081fd5b61096186610891565b94506020860135935060408601359250606086013567ffffffffffffffff81111561098a578182fd5b610996888289016108ad565b969995985093965092949392505050565b600080600080604085870312156109bc578384fd5b843567ffffffffffffffff808211156109d3578586fd5b6109df888389016108ad565b909650945060208701359150808211156109f7578384fd5b50610a04878288016108ad565b95989497509550505050565b600060208284031215610a21578081fd5b5035919050565b6020808252601d908201527f4f776e61626c653a2073656e646572206d757374206265206f776e6572000000604082015260600190565b6000600019821415610a7f57634e487b7160e01b81526011600452602481fd5b506001019056fe24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce6617890a2646970667358221220cb2ed2ee0a705f147a31ae442179693a05e37fecc5d931e5673016c6d2eb9bf064736f6c63430008040033
Net Worth in USD
Net Worth in ETH
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.