Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 7678917 | 273 days ago | Contract Creation | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
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
Contract Source Code (Solidity Standard Json-Input format)
/// 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;
}
}{
"optimizer": {
"enabled": true,
"mode": "3"
},
"outputSelection": {
"*": {
"*": [
"abi"
]
}
},
"detectMissingLibraries": false,
"forceEVMLA": false,
"enableEraVMExtensions": false,
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
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"}]Contract Creation Code
9c4d535b0000000000000000000000000000000000000000000000000000000000000000010000b73ebb409cca9c4b28a6a0e7387ac29184198c2475ebaa54f73f93913d00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x0001000000000002000600000000000200000000000103550000008008000039000000400080043f0000000100200190000000520000c13d0000006002100270000000a102200197000000040020008c000002730000413d000000000301043b000000a303300197000000a40030009c000002730000c13d000000240020008c000002730000413d0000000003000416000000000003004b000002730000c13d0000000403100370000000000303043b000000a50030009c000002730000213d0000002304300039000000000024004b000002730000813d0000000404300039000000000141034f000000000101043b000400000001001d000000a50010009c000002730000213d000300240030003d0000000401000029000000a0011000c90000000301100029000000000021004b000002730000213d000000040100002900000005021002100000003f01200039000000a603100197000000a70030009c0000006a0000213d0000008001300039000000400010043f0000000404000029000000800040043f000000000004004b0000005a0000c13d00000020020000390000000003210436000000800200043d00000000002304350000004003100039000000000002004b000000490000613d000000000400001900000000050100190000000006030019000000200880003900000000030804330000000073030434000000000036043500000060035000390000000005070433000000000053043500000040036000390000000104400039000000000024004b00000000050600190000003c0000413d0000000002130049000000a10020009c000000a1020080410000006002200210000000a10010009c000000a1010080410000004001100210000000000112019f0000027f0001042e0000000001000416000000000001004b000002730000c13d000000200100003900000100001004430000012000000443000000a2010000410000027f0001042e000000a80030009c0000006a0000213d00000000030000190000004004100039000000400040043f000000200410003900000000000404350000000000010435000000a00430003900000000001404350000002003300039000000000023004b000000700000813d000000400100043d000000b50010009c0000005d0000a13d000000b401000041000000000010043f0000004101000039000000040010043f000000b001000041000002800001043000000000060000190000007c0000013d000000800200043d000000000062004b00000005040000290000026d0000a13d0000000002040433000000200220003900000000001204350000000106600039000000040060006c000002750000813d000000a0016000c900000003011000290000000002100367000000000202043b000000ff0020008c000002730000213d000000000002004b000000fb0000613d000000010020008c0000014a0000613d000000020020008c000000790000c13d00000020071000390000000001700367000000000201043b000000a90020009c000002730000213d00000040087000390000000001800367000000000101043b000000a90010009c000002730000213d00000020038000390000000003300367000000000403043b000000a90040009c000002730000213d000000a905200198000000010300008a000600000006001d000000d40000613d000000aa0050009c000000d40000613d000200000008001d000500000007001d000000400500043d000100000005001d00000024035000390000000000430435000000ab03000041000000000035043500000004035000390000000000130435000000a10050009c000000a101000041000000000105401900000040011002100000000003000414000000a10030009c000000a103008041000000c003300210000000000113019f000000ac011001c7027e02790000040f00000001090000290000006003100270000000a105300197000000200050008c000000200500803900000020045001900000000003490019000000c00000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b000000bc0000c13d0000001f05500190000000cd0000613d000000000141034f0000000304500210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f000000000013043500000001002001900000000003000019000000060600002900000005070000290000000208000029000000d40000613d0000000003090433000000800100043d000000000061004b0000026d0000a13d0000000501600210000000a004100039000000000104043300000000003104350000000001000367000000000271034f000000000202043b000000a90020009c000002730000213d000000000181034f000000000101043b000000a90010009c000002730000213d000500000004001d000000a903200197000000aa0030009c000000ea0000613d000000000003004b000002370000c13d000000ad02000041000000000020044300000004001004430000000001000414000000a10010009c000000a101008041000000c001100210000000ae011001c70000800a02000039027e02790000040f0000000100200190000002770000613d000000000101043b0000008008000039000000060600002900000005040000290000026a0000013d00000020071000390000000001700367000000000201043b000000a90020009c000002730000213d00000040057000390000000001500367000000000101043b000000a90010009c000002730000213d00000020035000390000000003300367000000000403043b000000a90040009c000002730000213d000000a903200198000600000006001d000200000005001d0000019a0000613d000000aa0030009c00000000030000190000019b0000613d000500000007001d000000400500043d000100000005001d00000024035000390000000000430435000000b103000041000000000035043500000004035000390000000000130435000000a10050009c000000a101000041000000000105401900000040011002100000000003000414000000a10030009c000000a103008041000000c003300210000000000113019f000000ac011001c7027e02790000040f00000001090000290000006003100270000000a105300197000000200050008c000000200500803900000020045001900000000003490019000001330000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b0000012f0000c13d0000001f05500190000001400000613d000000000141034f0000000304500210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f000000000013043500000001002001900000000003000019000000060600002900000005070000290000019b0000613d0000000001090433000000000001004b000000010300c03900000000030060190000019b0000013d00000020071000390000000001700367000000000201043b000000a90020009c000002730000213d00000040057000390000000001500367000000000101043b000000a90010009c000002730000213d00000020035000390000000003300367000000000403043b000000a90040009c000002730000213d000000a903200198000600000006001d000001ed0000613d000000aa0030009c0000000003000019000001ee0000613d000200000007001d000500000005001d000000400500043d000100000005001d00000024035000390000000000430435000000b103000041000000000035043500000004035000390000000000130435000000a10050009c000000a101000041000000000105401900000040011002100000000003000414000000a10030009c000000a103008041000000c003300210000000000113019f000000ac011001c7027e02790000040f00000001090000290000006003100270000000a105300197000000200050008c000000200500803900000020045001900000000003490019000001820000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b0000017e0000c13d0000001f055001900000018f0000613d000000000141034f0000000304500210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f000000000013043500000001002001900000000003000019000000060600002900000005050000290000000207000029000001ee0000613d0000000001090433000000000001004b000000010300c0390000000003006019000001ee0000013d0000000003000019000000800100043d000000000061004b0000026d0000a13d0000000501600210000000a004100039000000000104043300000000003104350000000001000367000000000271034f000000000202043b000000a90020009c000002730000213d000500000004001d0000002003700039000000000131034f000000000101043b000000400400043d000100000004001d000000b303000041000000000034043500000004034000390000000000130435000000a10040009c000000a101000041000000000104401900000040011002100000000003000414000000a10030009c000000a103008041000000c003300210000000000113019f000000b0011001c7027e02790000040f00000001090000290000006003100270000000a105300197000000200050008c000000200500803900000020045001900000000003490019000001ca0000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b000001c60000c13d0000001f05500190000001d70000613d000000000141034f0000000304500210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000000100200190000000000100001900000080080000390000000606000029000001e00000613d0000000002090433000000a90020009c0000000001000019000000000102a01900000002020000290000000002200367000000000202043b000000a90020009c0000000504000029000002730000213d000000800300043d000000000063004b0000026d0000a13d000000000021004b00000000010000390000000101006039000000760000013d0000000003000019000000800100043d000000000061004b0000026d0000a13d0000000501600210000000a004100039000000000104043300000000003104350000000001000367000000000271034f000000000202043b000000a90020009c000002730000213d000000000351034f000000000303043b000000a90030009c000002730000213d000500000004001d000000200450008a000000000141034f000000000101043b000000400500043d000200000005001d00000024045000390000000000140435000000b201000041000000000015043500000004015000390000000000310435000000a10050009c000000a101000041000000000105401900000040011002100000000003000414000000a10030009c000000a103008041000000c003300210000000000113019f000000ac011001c7027e02790000040f00000002090000290000006003100270000000a105300197000000200050008c000000200500803900000020045001900000000003490019000002230000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b0000021f0000c13d0000001f05500190000002300000613d000000000141034f0000000304500210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000000100200190000000000100001900000080080000390000000606000029000000720000613d0000000001090433000000720000013d000000400400043d000200000004001d000000af03000041000000000034043500000004034000390000000000130435000000a10040009c000000a101000041000000000104401900000040011002100000000003000414000000a10030009c000000a103008041000000c003300210000000000113019f000000b0011001c7027e02790000040f00000002090000290000006003100270000000a105300197000000200050008c000000200500803900000020045001900000000003490019000002560000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b000002520000c13d0000001f055001900000000606000029000002640000613d000000000141034f0000000304500210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f000000000013043500000001002001900000000001000019000000800800003900000005040000290000026a0000613d0000000001090433000000800200043d000000000062004b000000760000213d000000b401000041000000000010043f0000003201000039000000040010043f000000b001000041000002800001043000000000010000190000028000010430000000400100043d000000330000013d000000000001042f000000000001042f0000027c002104230000000102000039000000000001042d0000000002000019000000000001042d0000027e000004320000027f0001042e000002800001043000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0000000200000000000000000000000000000040000001000000000000000000ffffffff000000000000000000000000000000000000000000000000000000009231ee1400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff7f000000000000000000000000000000000000000000000000ffffffffffffff3f000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeedd62ed3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000000000009cc7f708afc65944829bd487b90b72536b1951864fbfc14e125fc972a6507f39020000020000000000000000000000000000002400000000000000000000000070a08231000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000e985e9c50000000000000000000000000000000000000000000000000000000000fdd58e000000000000000000000000000000000000000000000000000000006352211e000000000000000000000000000000000000000000000000000000004e487b7100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffbfc73da8898a721dd2c2060ae83d5b04bde3cdd6ba342eab8e1aa9af18457650e7
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
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.