ETH Price: $2,941.30 (-0.63%)

Contract

0xe06ae5521D10dca01A1E478FecE92d8abE116A7C

Overview

ETH Balance

0 ETH

ETH Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To

There are no matching entries

1 Internal Transaction found.

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
76789172025-04-26 12:21:48273 days ago1745670108  Contract Creation0 ETH
Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ApprovalAndBalanceHelperFeature

Compiler Version
v0.8.17+commit.8df45f5f

ZkSolc Version
v1.5.12

Optimization Enabled:
Yes with Mode 3

Other Settings:
default evmVersion
/// SPDX-License-Identifier: MIT

pragma solidity ^0.8.17;

import "../../libs/LibAssetHelper.sol";

contract ApprovalAndBalanceHelperFeature is LibAssetHelper {

    struct ABItemInfo {
        uint8 itemType; // 0: ERC721, 1: ERC1155, 2: ERC20
        address token;
        uint256 tokenId;
        address account;
        address operator;
    }

    struct ABResultInfo {
        uint256 approval;
        uint256 balance;
    }

    function getApprovalsAndBalances(ABItemInfo[] calldata list)
        external
        view
        returns (ABResultInfo[] memory infos)
    {
        infos = new ABResultInfo[](list.length);
        for (uint256 i; i < list.length; i++) {
            uint8 itemType = list[i].itemType;
            if (itemType == 0) {
                infos[i].approval = _isApprovedForAll(list[i].token, true, list[i].account, list[i].operator);
                infos[i].balance = _erc721OwnerOf(list[i].token, list[i].tokenId) == list[i].account ? 1 : 0;
            } else if (itemType == 1) {
                infos[i].approval = _isApprovedForAll(list[i].token, false, list[i].account, list[i].operator);
                infos[i].balance = _erc1155BalanceOf(list[i].token, list[i].account, list[i].tokenId);
            } else if (itemType == 2) {
                infos[i].approval = _erc20Allowance(list[i].token, list[i].account, list[i].operator);
                infos[i].balance = _erc20BalanceOf(list[i].token, list[i].account);
            }
        }
        return infos;
    }
}

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.15;


abstract contract LibAssetHelper {

    address internal constant NATIVE_TOKEN_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
    uint256 internal constant ERC404_APPROVAL = 1 << 126;

    function _isApprovedForAll(
        address token,
        bool isERC721,
        address owner,
        address operator
    ) internal view returns(uint256 approval) {
        (approval, ) = _isApprovedForAllV2(token, isERC721, owner, operator);
    }

    function _isApprovedForAllV2(
        address token,
        bool isERC721,
        address owner,
        address operator
    ) internal view returns(uint256 approval, bool isERC404) {
        if (token == address(0) || token == NATIVE_TOKEN_ADDRESS) {
            return (0, false);
        }

        bool isApprovedForAll;
        assembly {
            let ptr := mload(0x40) // free memory pointer

            // selector for `isApprovedForAll(address,address)`
            mstore(ptr, 0xe985e9c500000000000000000000000000000000000000000000000000000000)
            mstore(add(ptr, 0x4), owner)
            mstore(add(ptr, 0x24), operator)

            if staticcall(gas(), token, ptr, 0x44, ptr, 0x20) {
                if gt(mload(ptr), 0) {
                    isApprovedForAll := 1
                }
            }
        }
        if (isApprovedForAll) {
            return (1, false);
        }
//        if (isERC721) {
//            if (_erc20Decimals(token) == 0) {
//                return (0, false);
//            }
//            (uint256 allowance, bool success) = _erc20AllowanceV2(token, owner, operator);
//            approval = allowance > ERC404_APPROVAL ? 1 : 0;
//            isERC404 = success;
//            return (approval, isERC404);
//        } else {
//            return (0, false);
//        }
        return (0, false);
    }

    function _erc721OwnerOf(
        address token, uint256 tokenId
    ) internal view returns (address owner) {
        assembly {
            let ptr := mload(0x40) // free memory pointer

            // selector for `ownerOf(uint256)`
            mstore(ptr, 0x6352211e00000000000000000000000000000000000000000000000000000000)
            mstore(add(ptr, 0x4), tokenId)

            if staticcall(gas(), token, ptr, 0x24, ptr, 0x20) {
                if lt(mload(ptr), shl(160, 1)) {
                    owner := mload(ptr)
                }
            }
        }
        return owner;
    }

    function _erc721GetApproved(
        address token, uint256 tokenId
    ) internal view returns (address operator) {
        assembly {
            let ptr := mload(0x40) // free memory pointer

            // selector for `getApproved(uint256)`
            mstore(ptr, 0x081812fc00000000000000000000000000000000000000000000000000000000)
            mstore(add(ptr, 0x4), tokenId)

            if staticcall(gas(), token, ptr, 0x24, ptr, 0x20) {
                if lt(mload(ptr), shl(160, 1)) {
                    operator := mload(ptr)
                }
            }
        }
        return operator;
    }

    function _erc1155BalanceOf(
        address token,
        address account,
        uint256 tokenId
    ) internal view returns (uint256 _balance) {
        assembly {
            let ptr := mload(0x40) // free memory pointer

            // selector for `balanceOf(address,uint256)`
            mstore(ptr, 0x00fdd58e00000000000000000000000000000000000000000000000000000000)
            mstore(add(ptr, 0x4), account)
            mstore(add(ptr, 0x24), tokenId)

            if staticcall(gas(), token, ptr, 0x44, ptr, 0x20) {
                _balance := mload(ptr)
            }
        }
        return _balance;
    }

    function _erc20BalanceOf(
        address token, address account
    ) internal view returns (uint256 _balance) {
        if (token == address(0) || token == NATIVE_TOKEN_ADDRESS) {
            return account.balance;
        }
        assembly {
            let ptr := mload(0x40) // free memory pointer

            // selector for `balanceOf(address)`
            mstore(ptr, 0x70a0823100000000000000000000000000000000000000000000000000000000)
            mstore(add(ptr, 0x4), account)

            if staticcall(gas(), token, ptr, 0x24, ptr, 0x20) {
                _balance := mload(ptr)
            }
        }
        return _balance;
    }

    function _erc20Allowance(
        address token,
        address owner,
        address spender
    ) internal view returns (uint256 allowance) {
        (allowance, ) = _erc20AllowanceV2(token, owner, spender);
    }

    function _erc20AllowanceV2(
        address token,
        address owner,
        address spender
    ) internal view returns (uint256 allowance, bool callSuccess) {
        if (token == address(0) || token == NATIVE_TOKEN_ADDRESS) {
            return (type(uint256).max, false);
        }
        assembly {
            let ptr := mload(0x40) // free memory pointer

            // selector for `allowance(address,address)`
            mstore(ptr, 0xdd62ed3e00000000000000000000000000000000000000000000000000000000)
            mstore(add(ptr, 0x4), owner)
            mstore(add(ptr, 0x24), spender)

            if staticcall(gas(), token, ptr, 0x44, ptr, 0x20) {
                allowance := mload(ptr)
                callSuccess := 1
            }
        }
        return (allowance, callSuccess);
    }

    function _erc20Decimals(address token) internal view returns (uint8 decimals) {
        if (token == address(0) || token == NATIVE_TOKEN_ADDRESS) {
            return 18;
        }
        assembly {
            let ptr := mload(0x40) // free memory pointer

            // selector for `decimals()`
            mstore(ptr, 0x313ce56700000000000000000000000000000000000000000000000000000000)

            if staticcall(gas(), token, ptr, 0x4, ptr, 0x20) {
                if lt(mload(ptr), 48) {
                    decimals := mload(ptr)
                }
            }
        }
        return decimals;
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "mode": "3"
  },
  "outputSelection": {
    "*": {
      "*": [
        "abi"
      ]
    }
  },
  "detectMissingLibraries": false,
  "forceEVMLA": false,
  "enableEraVMExtensions": false,
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"components":[{"internalType":"uint8","name":"itemType","type":"uint8"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"internalType":"struct ApprovalAndBalanceHelperFeature.ABItemInfo[]","name":"list","type":"tuple[]"}],"name":"getApprovalsAndBalances","outputs":[{"components":[{"internalType":"uint256","name":"approval","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"}],"internalType":"struct ApprovalAndBalanceHelperFeature.ABResultInfo[]","name":"infos","type":"tuple[]"}],"stateMutability":"view","type":"function"}]

9c4d535b0000000000000000000000000000000000000000000000000000000000000000010000b73ebb409cca9c4b28a6a0e7387ac29184198c2475ebaa54f73f93913d00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x0001000000000002000600000000000200000000000103550000008008000039000000400080043f0000000100200190000000520000c13d0000006002100270000000a102200197000000040020008c000002730000413d000000000301043b000000a303300197000000a40030009c000002730000c13d000000240020008c000002730000413d0000000003000416000000000003004b000002730000c13d0000000403100370000000000303043b000000a50030009c000002730000213d0000002304300039000000000024004b000002730000813d0000000404300039000000000141034f000000000101043b000400000001001d000000a50010009c000002730000213d000300240030003d0000000401000029000000a0011000c90000000301100029000000000021004b000002730000213d000000040100002900000005021002100000003f01200039000000a603100197000000a70030009c0000006a0000213d0000008001300039000000400010043f0000000404000029000000800040043f000000000004004b0000005a0000c13d00000020020000390000000003210436000000800200043d00000000002304350000004003100039000000000002004b000000490000613d000000000400001900000000050100190000000006030019000000200880003900000000030804330000000073030434000000000036043500000060035000390000000005070433000000000053043500000040036000390000000104400039000000000024004b00000000050600190000003c0000413d0000000002130049000000a10020009c000000a1020080410000006002200210000000a10010009c000000a1010080410000004001100210000000000112019f0000027f0001042e0000000001000416000000000001004b000002730000c13d000000200100003900000100001004430000012000000443000000a2010000410000027f0001042e000000a80030009c0000006a0000213d00000000030000190000004004100039000000400040043f000000200410003900000000000404350000000000010435000000a00430003900000000001404350000002003300039000000000023004b000000700000813d000000400100043d000000b50010009c0000005d0000a13d000000b401000041000000000010043f0000004101000039000000040010043f000000b001000041000002800001043000000000060000190000007c0000013d000000800200043d000000000062004b00000005040000290000026d0000a13d0000000002040433000000200220003900000000001204350000000106600039000000040060006c000002750000813d000000a0016000c900000003011000290000000002100367000000000202043b000000ff0020008c000002730000213d000000000002004b000000fb0000613d000000010020008c0000014a0000613d000000020020008c000000790000c13d00000020071000390000000001700367000000000201043b000000a90020009c000002730000213d00000040087000390000000001800367000000000101043b000000a90010009c000002730000213d00000020038000390000000003300367000000000403043b000000a90040009c000002730000213d000000a905200198000000010300008a000600000006001d000000d40000613d000000aa0050009c000000d40000613d000200000008001d000500000007001d000000400500043d000100000005001d00000024035000390000000000430435000000ab03000041000000000035043500000004035000390000000000130435000000a10050009c000000a101000041000000000105401900000040011002100000000003000414000000a10030009c000000a103008041000000c003300210000000000113019f000000ac011001c7027e02790000040f00000001090000290000006003100270000000a105300197000000200050008c000000200500803900000020045001900000000003490019000000c00000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b000000bc0000c13d0000001f05500190000000cd0000613d000000000141034f0000000304500210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f000000000013043500000001002001900000000003000019000000060600002900000005070000290000000208000029000000d40000613d0000000003090433000000800100043d000000000061004b0000026d0000a13d0000000501600210000000a004100039000000000104043300000000003104350000000001000367000000000271034f000000000202043b000000a90020009c000002730000213d000000000181034f000000000101043b000000a90010009c000002730000213d000500000004001d000000a903200197000000aa0030009c000000ea0000613d000000000003004b000002370000c13d000000ad02000041000000000020044300000004001004430000000001000414000000a10010009c000000a101008041000000c001100210000000ae011001c70000800a02000039027e02790000040f0000000100200190000002770000613d000000000101043b0000008008000039000000060600002900000005040000290000026a0000013d00000020071000390000000001700367000000000201043b000000a90020009c000002730000213d00000040057000390000000001500367000000000101043b000000a90010009c000002730000213d00000020035000390000000003300367000000000403043b000000a90040009c000002730000213d000000a903200198000600000006001d000200000005001d0000019a0000613d000000aa0030009c00000000030000190000019b0000613d000500000007001d000000400500043d000100000005001d00000024035000390000000000430435000000b103000041000000000035043500000004035000390000000000130435000000a10050009c000000a101000041000000000105401900000040011002100000000003000414000000a10030009c000000a103008041000000c003300210000000000113019f000000ac011001c7027e02790000040f00000001090000290000006003100270000000a105300197000000200050008c000000200500803900000020045001900000000003490019000001330000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b0000012f0000c13d0000001f05500190000001400000613d000000000141034f0000000304500210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f000000000013043500000001002001900000000003000019000000060600002900000005070000290000019b0000613d0000000001090433000000000001004b000000010300c03900000000030060190000019b0000013d00000020071000390000000001700367000000000201043b000000a90020009c000002730000213d00000040057000390000000001500367000000000101043b000000a90010009c000002730000213d00000020035000390000000003300367000000000403043b000000a90040009c000002730000213d000000a903200198000600000006001d000001ed0000613d000000aa0030009c0000000003000019000001ee0000613d000200000007001d000500000005001d000000400500043d000100000005001d00000024035000390000000000430435000000b103000041000000000035043500000004035000390000000000130435000000a10050009c000000a101000041000000000105401900000040011002100000000003000414000000a10030009c000000a103008041000000c003300210000000000113019f000000ac011001c7027e02790000040f00000001090000290000006003100270000000a105300197000000200050008c000000200500803900000020045001900000000003490019000001820000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b0000017e0000c13d0000001f055001900000018f0000613d000000000141034f0000000304500210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f000000000013043500000001002001900000000003000019000000060600002900000005050000290000000207000029000001ee0000613d0000000001090433000000000001004b000000010300c0390000000003006019000001ee0000013d0000000003000019000000800100043d000000000061004b0000026d0000a13d0000000501600210000000a004100039000000000104043300000000003104350000000001000367000000000271034f000000000202043b000000a90020009c000002730000213d000500000004001d0000002003700039000000000131034f000000000101043b000000400400043d000100000004001d000000b303000041000000000034043500000004034000390000000000130435000000a10040009c000000a101000041000000000104401900000040011002100000000003000414000000a10030009c000000a103008041000000c003300210000000000113019f000000b0011001c7027e02790000040f00000001090000290000006003100270000000a105300197000000200050008c000000200500803900000020045001900000000003490019000001ca0000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b000001c60000c13d0000001f05500190000001d70000613d000000000141034f0000000304500210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000000100200190000000000100001900000080080000390000000606000029000001e00000613d0000000002090433000000a90020009c0000000001000019000000000102a01900000002020000290000000002200367000000000202043b000000a90020009c0000000504000029000002730000213d000000800300043d000000000063004b0000026d0000a13d000000000021004b00000000010000390000000101006039000000760000013d0000000003000019000000800100043d000000000061004b0000026d0000a13d0000000501600210000000a004100039000000000104043300000000003104350000000001000367000000000271034f000000000202043b000000a90020009c000002730000213d000000000351034f000000000303043b000000a90030009c000002730000213d000500000004001d000000200450008a000000000141034f000000000101043b000000400500043d000200000005001d00000024045000390000000000140435000000b201000041000000000015043500000004015000390000000000310435000000a10050009c000000a101000041000000000105401900000040011002100000000003000414000000a10030009c000000a103008041000000c003300210000000000113019f000000ac011001c7027e02790000040f00000002090000290000006003100270000000a105300197000000200050008c000000200500803900000020045001900000000003490019000002230000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b0000021f0000c13d0000001f05500190000002300000613d000000000141034f0000000304500210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000000100200190000000000100001900000080080000390000000606000029000000720000613d0000000001090433000000720000013d000000400400043d000200000004001d000000af03000041000000000034043500000004034000390000000000130435000000a10040009c000000a101000041000000000104401900000040011002100000000003000414000000a10030009c000000a103008041000000c003300210000000000113019f000000b0011001c7027e02790000040f00000002090000290000006003100270000000a105300197000000200050008c000000200500803900000020045001900000000003490019000002560000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b000002520000c13d0000001f055001900000000606000029000002640000613d000000000141034f0000000304500210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f000000000013043500000001002001900000000001000019000000800800003900000005040000290000026a0000613d0000000001090433000000800200043d000000000062004b000000760000213d000000b401000041000000000010043f0000003201000039000000040010043f000000b001000041000002800001043000000000010000190000028000010430000000400100043d000000330000013d000000000001042f000000000001042f0000027c002104230000000102000039000000000001042d0000000002000019000000000001042d0000027e000004320000027f0001042e000002800001043000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0000000200000000000000000000000000000040000001000000000000000000ffffffff000000000000000000000000000000000000000000000000000000009231ee1400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff7f000000000000000000000000000000000000000000000000ffffffffffffff3f000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeedd62ed3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000000000009cc7f708afc65944829bd487b90b72536b1951864fbfc14e125fc972a6507f39020000020000000000000000000000000000002400000000000000000000000070a08231000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000e985e9c50000000000000000000000000000000000000000000000000000000000fdd58e000000000000000000000000000000000000000000000000000000006352211e000000000000000000000000000000000000000000000000000000004e487b7100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffbfc73da8898a721dd2c2060ae83d5b04bde3cdd6ba342eab8e1aa9af18457650e7

Block Transaction 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  ]

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.