ETH Price: $2,952.39 (-0.42%)

Contract

0xD0eD73b33789111807BD64aE2a6E1e6f92f986f5

Overview

ETH Balance

0 ETH

ETH Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Claim Migrated C...1887023592024-03-09 15:59:29686 days ago1709999969IN
0xD0eD73b3...f92f986f5
0 ETH0.000567720.1
Transfer Ownersh...765630052023-04-03 9:16:321027 days ago1680513392IN
0xD0eD73b3...f92f986f5
0 ETH0.000031910.1
Claim Migrated C...615155462023-02-16 16:42:591073 days ago1676565779IN
0xD0eD73b3...f92f986f5
0 ETH0.000760730.1
Claim Migrated C...144340602022-06-12 20:01:441321 days ago1655064104IN
0xD0eD73b3...f92f986f5
0 ETH0.000589231364 ETH0.33396947
Claim Migrated C...144340362022-06-12 20:01:441321 days ago1655064104IN
0xD0eD73b3...f92f986f5
0 ETH0.000589240381 ETH0.33396947
Claim Migrated C...135638392022-06-02 22:31:241331 days ago1654209084IN
0xD0eD73b3...f92f986f5
0 ETH0.001228432932 ETH0.69555423
Claim Migrated C...102603272022-04-21 13:16:491374 days ago1650547009IN
0xD0eD73b3...f92f986f5
0 ETH0.000989829627 ETH0.5606175
Claim Migrated C...102603222022-04-21 13:16:491374 days ago1650547009IN
0xD0eD73b3...f92f986f5
0 ETH0.000960313116 ETH0.5606175
Claim Migrated C...102603112022-04-21 13:15:341374 days ago1650546934IN
0xD0eD73b3...f92f986f5
0 ETH0.000986818551 ETH0.5606175
Claim Migrated C...97662772022-04-14 0:56:531381 days ago1649897813IN
0xD0eD73b3...f92f986f5
0 ETH0.000819039399 ETH0.46350689
Claim Migrated C...97662672022-04-14 0:56:531381 days ago1649897813IN
0xD0eD73b3...f92f986f5
0 ETH0.000818386318 ETH0.46350689
Claim Migrated C...77499662022-03-11 18:18:181414 days ago1647022698IN
0xD0eD73b3...f92f986f5
0 ETH0.000529657439 ETH0.30870855
Claim Migrated C...77499612022-03-11 18:18:181414 days ago1647022698IN
0xD0eD73b3...f92f986f5
0 ETH0.00052966454 ETH0.30870855
Claim Migrated C...77499542022-03-11 18:18:181414 days ago1647022698IN
0xD0eD73b3...f92f986f5
0 ETH0.0005292342 ETH0.30870855
Claim Migrated C...77499202022-03-11 18:16:171414 days ago1647022577IN
0xD0eD73b3...f92f986f5
0 ETH0.000415950509 ETH0.30870855
Claim Migrated C...77499182022-03-11 18:16:171414 days ago1647022577IN
0xD0eD73b3...f92f986f5
0 ETH0.000416811189 ETH0.30870855
Claim Migrated C...77499132022-03-11 18:16:171414 days ago1647022577IN
0xD0eD73b3...f92f986f5
0 ETH0.000492617352 ETH0.30870855
Claim Migrated C...77499062022-03-11 18:15:431414 days ago1647022543IN
0xD0eD73b3...f92f986f5
0 ETH0.000414247364 ETH0.30870855
Claim Migrated C...77498952022-03-11 18:15:431414 days ago1647022543IN
0xD0eD73b3...f92f986f5
0 ETH0.000416801619 ETH0.30870855
Claim Migrated C...77498892022-03-11 18:15:431414 days ago1647022543IN
0xD0eD73b3...f92f986f5
0 ETH0.000416374366 ETH0.30870855
Claim Migrated C...77498762022-03-11 18:14:011414 days ago1647022441IN
0xD0eD73b3...f92f986f5
0 ETH0.000451574241 ETH0.30870855
Claim Migrated C...77498642022-03-11 18:14:011414 days ago1647022441IN
0xD0eD73b3...f92f986f5
0 ETH0.000452005816 ETH0.30870855
Claim Migrated C...77498512022-03-11 18:14:011414 days ago1647022441IN
0xD0eD73b3...f92f986f5
0 ETH0.000452000259 ETH0.30870855
Claim Migrated C...77498442022-03-11 18:14:011414 days ago1647022441IN
0xD0eD73b3...f92f986f5
0 ETH0.000451150385 ETH0.30870855
Claim Migrated C...67579282022-02-23 21:49:261430 days ago1645652966IN
0xD0eD73b3...f92f986f5
0 ETH0.001276445757 ETH0.74394098
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
615155462023-02-16 16:42:591073 days ago1676565779
0xD0eD73b3...f92f986f5
0 ETH
144340602022-06-12 20:01:441321 days ago1655064104
0xD0eD73b3...f92f986f5
0 ETH
144340362022-06-12 20:01:441321 days ago1655064104
0xD0eD73b3...f92f986f5
0 ETH
135638392022-06-02 22:31:241331 days ago1654209084
0xD0eD73b3...f92f986f5
0 ETH
102603272022-04-21 13:16:491374 days ago1650547009
0xD0eD73b3...f92f986f5
0 ETH
102603272022-04-21 13:16:491374 days ago1650547009
0xD0eD73b3...f92f986f5
0 ETH
102603222022-04-21 13:16:491374 days ago1650547009
0xD0eD73b3...f92f986f5
0 ETH
102603222022-04-21 13:16:491374 days ago1650547009
0xD0eD73b3...f92f986f5
0 ETH
102603112022-04-21 13:15:341374 days ago1650546934
0xD0eD73b3...f92f986f5
0 ETH
102603112022-04-21 13:15:341374 days ago1650546934
0xD0eD73b3...f92f986f5
0 ETH
97662772022-04-14 0:56:531381 days ago1649897813
0xD0eD73b3...f92f986f5
0 ETH
97662772022-04-14 0:56:531381 days ago1649897813
0xD0eD73b3...f92f986f5
0 ETH
97662672022-04-14 0:56:531381 days ago1649897813
0xD0eD73b3...f92f986f5
0 ETH
97662672022-04-14 0:56:531381 days ago1649897813
0xD0eD73b3...f92f986f5
0 ETH
77499662022-03-11 18:18:181414 days ago1647022698
0xD0eD73b3...f92f986f5
0 ETH
77499662022-03-11 18:18:181414 days ago1647022698
0xD0eD73b3...f92f986f5
0 ETH
77499612022-03-11 18:18:181414 days ago1647022698
0xD0eD73b3...f92f986f5
0 ETH
77499612022-03-11 18:18:181414 days ago1647022698
0xD0eD73b3...f92f986f5
0 ETH
77499542022-03-11 18:18:181414 days ago1647022698
0xD0eD73b3...f92f986f5
0 ETH
77499542022-03-11 18:18:181414 days ago1647022698
0xD0eD73b3...f92f986f5
0 ETH
77499202022-03-11 18:16:171414 days ago1647022577
0xD0eD73b3...f92f986f5
0 ETH
77499202022-03-11 18:16:171414 days ago1647022577
0xD0eD73b3...f92f986f5
0 ETH
77499182022-03-11 18:16:171414 days ago1647022577
0xD0eD73b3...f92f986f5
0 ETH
77499182022-03-11 18:16:171414 days ago1647022577
0xD0eD73b3...f92f986f5
0 ETH
77499132022-03-11 18:16:171414 days ago1647022577
0xD0eD73b3...f92f986f5
0 ETH
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CardsMerkleProofClaim

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
// 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));
    }
}

File 3 of 21 : MerkleProof.sol
// 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;
    }
}

File 5 of 21 : CardsMerkleProofClaimStorage.sol
// 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);
    }
}

File 7 of 21 : SafeOwnableInternal.sol
// 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;
}

File 10 of 21 : OwnableInternal.sol
// 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;
    }
}

File 12 of 21 : ERC1155EnumerableInternal.sol
// 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);
                    }
                }
            }
        }
    }
}

File 13 of 21 : CardsMintStorage.sol
// 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 {}
}

File 16 of 21 : ERC1155EnumerableStorage.sol
// 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);
        }
    }
}

File 18 of 21 : IERC1155Internal.sol
// 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);
}

File 20 of 21 : ERC1155BaseStorage.sol
// 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);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

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"}]

608060405234801561001057600080fd5b503361002461004760201b61078c1760201c565b80546001600160a01b0319166001600160a01b039290921691909117905561006b565b7f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f67168046090565b610adc8061007a6000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c80638da5cb5b116100665780638da5cb5b146100fd5780639253e50f14610105578063a6ede02b14610118578063a91c55261461012b578063f2fde38b1461013e57600080fd5b80630789ce8914610098578063688cfc66146100ad57806379ba5097146100d55780638ab5150a146100dd575b600080fd5b6100ab6100a63660046109a7565b610151565b005b6100c06100bb366004610941565b6102c0565b60405190151581526020015b60405180910390f35b6100ab61035c565b6100e5610461565b6040516001600160a01b0390911681526020016100cc565b6100e5610482565b6100ab610113366004610941565b61048c565b6100c0610126366004610918565b6106a6565b6100ab610139366004610a10565b6106f0565b6100ab61014c3660046108f7565b610744565b61015961078c565b546001600160a01b0316331461018a5760405162461bcd60e51b815260040161018190610a28565b60405180910390fd5b8281146101e85760405162461bcd60e51b815260206004820152602660248201527f43617264734d65726b6c6550726f6f66436c61696d3a20696e76616c6964206c604482015265656e6774687360d01b6064820152608401610181565b7f8b709c7112bdc61083dc731c7c8b862deebc9e7ddb3dfaf82970b150a88452a960005b848110156102b85783838281811061023457634e487b7160e01b600052603260045260246000fd5b905060200201602081019061024991906108f7565b82600088888581811061026c57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080806102b090610a5f565b91505061020c565b505050505050565b6040516bffffffffffffffffffffffff19606087901b1660208201526034810185905260548101849052600090819060740160405160208183030381529060405280519060200120905061035184848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061034a92506107b0915050565b54836107d4565b979650505050505050565b600080516020610a87833981519152546001600160a01b031633146103d55760405162461bcd60e51b815260206004820152602960248201527f536166654f776e61626c653a2073656e646572206d757374206265206e6f6d696044820152683732b29037bbb732b960b91b6064820152608401610181565b60006103df61078c565b805460405191925033916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a380546001600160a01b0319163317815561045e6000600080516020610a878339815191525b9081546001600160a01b0319166001600160a01b0391909116179055565b50565b6000600080516020610a878339815191525b546001600160a01b0316919050565b600061047361078c565b61049685856106a6565b156104f25760405162461bcd60e51b815260206004820152602660248201527f43617264734d65726b6c6550726f6f66436c61696d3a20616c726561647920636044820152651b185a5b595960d21b6064820152608401610181565b6104ff85858585856102c0565b6105575760405162461bcd60e51b8152602060048201526024808201527f43617264734d65726b6c6550726f6f66436c61696d3a20696e76616c696420706044820152633937b7b360e11b6064820152608401610181565b6001600160a01b0385811660008181527f8b709c7112bdc61083dc731c7c8b862deebc9e7ddb3dfaf82970b150a88452a8602090815260408083208984528252808320805460ff191660011790557f8b709c7112bdc61083dc731c7c8b862deebc9e7ddb3dfaf82970b150a88452a9909152808220548151630ab714fb60e11b81526004810194909452602484018990526044840188905290517f8b709c7112bdc61083dc731c7c8b862deebc9e7ddb3dfaf82970b150a88452a794919091169263156e29f692606480830193919282900301818387803b15801561063b57600080fd5b505af115801561064f573d6000803e3d6000fd5b5050604080516001600160a01b038a168152602081018990529081018790527f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf79250606001905060405180910390a1505050505050565b6001600160a01b039190911660009081527f8b709c7112bdc61083dc731c7c8b862deebc9e7ddb3dfaf82970b150a88452a860209081526040808320938352929052205460ff1690565b6106f861078c565b546001600160a01b031633146107205760405162461bcd60e51b815260040161018190610a28565b7f8b709c7112bdc61083dc731c7c8b862deebc9e7ddb3dfaf82970b150a88452a755565b61074c61078c565b546001600160a01b031633146107745760405162461bcd60e51b815260040161018190610a28565b61045e81600080516020610a87833981519152610440565b7f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f67168046090565b7f8b709c7112bdc61083dc731c7c8b862deebc9e7ddb3dfaf82970b150a88452a790565b600081815b855181101561088657600086828151811061080457634e487b7160e01b600052603260045260246000fd5b60200260200101519050808311610846576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250610873565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061087e81610a5f565b9150506107d9565b509092149392505050565b80356001600160a01b03811681146108a857600080fd5b919050565b60008083601f8401126108be578182fd5b50813567ffffffffffffffff8111156108d5578182fd5b6020830191508360208260051b85010111156108f057600080fd5b9250929050565b600060208284031215610908578081fd5b61091182610891565b9392505050565b6000806040838503121561092a578081fd5b61093383610891565b946020939093013593505050565b600080600080600060808688031215610958578081fd5b61096186610891565b94506020860135935060408601359250606086013567ffffffffffffffff81111561098a578182fd5b610996888289016108ad565b969995985093965092949392505050565b600080600080604085870312156109bc578384fd5b843567ffffffffffffffff808211156109d3578586fd5b6109df888389016108ad565b909650945060208701359150808211156109f7578384fd5b50610a04878288016108ad565b95989497509550505050565b600060208284031215610a21578081fd5b5035919050565b6020808252601d908201527f4f776e61626c653a2073656e646572206d757374206265206f776e6572000000604082015260600190565b6000600019821415610a7f57634e487b7160e01b81526011600452602481fd5b506001019056fe24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce6617890a2646970667358221220cb2ed2ee0a705f147a31ae442179693a05e37fecc5d931e5673016c6d2eb9bf064736f6c63430008040033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100935760003560e01c80638da5cb5b116100665780638da5cb5b146100fd5780639253e50f14610105578063a6ede02b14610118578063a91c55261461012b578063f2fde38b1461013e57600080fd5b80630789ce8914610098578063688cfc66146100ad57806379ba5097146100d55780638ab5150a146100dd575b600080fd5b6100ab6100a63660046109a7565b610151565b005b6100c06100bb366004610941565b6102c0565b60405190151581526020015b60405180910390f35b6100ab61035c565b6100e5610461565b6040516001600160a01b0390911681526020016100cc565b6100e5610482565b6100ab610113366004610941565b61048c565b6100c0610126366004610918565b6106a6565b6100ab610139366004610a10565b6106f0565b6100ab61014c3660046108f7565b610744565b61015961078c565b546001600160a01b0316331461018a5760405162461bcd60e51b815260040161018190610a28565b60405180910390fd5b8281146101e85760405162461bcd60e51b815260206004820152602660248201527f43617264734d65726b6c6550726f6f66436c61696d3a20696e76616c6964206c604482015265656e6774687360d01b6064820152608401610181565b7f8b709c7112bdc61083dc731c7c8b862deebc9e7ddb3dfaf82970b150a88452a960005b848110156102b85783838281811061023457634e487b7160e01b600052603260045260246000fd5b905060200201602081019061024991906108f7565b82600088888581811061026c57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080806102b090610a5f565b91505061020c565b505050505050565b6040516bffffffffffffffffffffffff19606087901b1660208201526034810185905260548101849052600090819060740160405160208183030381529060405280519060200120905061035184848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061034a92506107b0915050565b54836107d4565b979650505050505050565b600080516020610a87833981519152546001600160a01b031633146103d55760405162461bcd60e51b815260206004820152602960248201527f536166654f776e61626c653a2073656e646572206d757374206265206e6f6d696044820152683732b29037bbb732b960b91b6064820152608401610181565b60006103df61078c565b805460405191925033916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a380546001600160a01b0319163317815561045e6000600080516020610a878339815191525b9081546001600160a01b0319166001600160a01b0391909116179055565b50565b6000600080516020610a878339815191525b546001600160a01b0316919050565b600061047361078c565b61049685856106a6565b156104f25760405162461bcd60e51b815260206004820152602660248201527f43617264734d65726b6c6550726f6f66436c61696d3a20616c726561647920636044820152651b185a5b595960d21b6064820152608401610181565b6104ff85858585856102c0565b6105575760405162461bcd60e51b8152602060048201526024808201527f43617264734d65726b6c6550726f6f66436c61696d3a20696e76616c696420706044820152633937b7b360e11b6064820152608401610181565b6001600160a01b0385811660008181527f8b709c7112bdc61083dc731c7c8b862deebc9e7ddb3dfaf82970b150a88452a8602090815260408083208984528252808320805460ff191660011790557f8b709c7112bdc61083dc731c7c8b862deebc9e7ddb3dfaf82970b150a88452a9909152808220548151630ab714fb60e11b81526004810194909452602484018990526044840188905290517f8b709c7112bdc61083dc731c7c8b862deebc9e7ddb3dfaf82970b150a88452a794919091169263156e29f692606480830193919282900301818387803b15801561063b57600080fd5b505af115801561064f573d6000803e3d6000fd5b5050604080516001600160a01b038a168152602081018990529081018790527f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf79250606001905060405180910390a1505050505050565b6001600160a01b039190911660009081527f8b709c7112bdc61083dc731c7c8b862deebc9e7ddb3dfaf82970b150a88452a860209081526040808320938352929052205460ff1690565b6106f861078c565b546001600160a01b031633146107205760405162461bcd60e51b815260040161018190610a28565b7f8b709c7112bdc61083dc731c7c8b862deebc9e7ddb3dfaf82970b150a88452a755565b61074c61078c565b546001600160a01b031633146107745760405162461bcd60e51b815260040161018190610a28565b61045e81600080516020610a87833981519152610440565b7f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f67168046090565b7f8b709c7112bdc61083dc731c7c8b862deebc9e7ddb3dfaf82970b150a88452a790565b600081815b855181101561088657600086828151811061080457634e487b7160e01b600052603260045260246000fd5b60200260200101519050808311610846576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250610873565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061087e81610a5f565b9150506107d9565b509092149392505050565b80356001600160a01b03811681146108a857600080fd5b919050565b60008083601f8401126108be578182fd5b50813567ffffffffffffffff8111156108d5578182fd5b6020830191508360208260051b85010111156108f057600080fd5b9250929050565b600060208284031215610908578081fd5b61091182610891565b9392505050565b6000806040838503121561092a578081fd5b61093383610891565b946020939093013593505050565b600080600080600060808688031215610958578081fd5b61096186610891565b94506020860135935060408601359250606086013567ffffffffffffffff81111561098a578182fd5b610996888289016108ad565b969995985093965092949392505050565b600080600080604085870312156109bc578384fd5b843567ffffffffffffffff808211156109d3578586fd5b6109df888389016108ad565b909650945060208701359150808211156109f7578384fd5b50610a04878288016108ad565b95989497509550505050565b600060208284031215610a21578081fd5b5035919050565b6020808252601d908201527f4f776e61626c653a2073656e646572206d757374206265206f776e6572000000604082015260600190565b6000600019821415610a7f57634e487b7160e01b81526011600452602481fd5b506001019056fe24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce6617890a2646970667358221220cb2ed2ee0a705f147a31ae442179693a05e37fecc5d931e5673016c6d2eb9bf064736f6c63430008040033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.