Created
May 25, 2022 06:32
-
-
Save fogmoon/234b0b070016fc54e87642c52aa3095f to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| pragma solidity ^0.4.25; | |
| // TRC20 contract interface | |
| contract Token { | |
| function balanceOf(address) public view returns (uint); | |
| } | |
| contract BatchBalance { | |
| /* Fallback function, don't accept any TRX */ | |
| function() public payable { | |
| revert("BalanceChecker does not accept payments"); | |
| } | |
| /* | |
| Check the token balance of a wallet in a token contract | |
| Returns the balance of the token for user. Avoids possible errors: | |
| - return 0 on non-contract address | |
| - returns 0 if the contract doesn't implement balanceOf | |
| */ | |
| function tokenBalance(address user, address token) public view returns (uint) { | |
| // check if token is actually a contract | |
| uint256 tokenCode; | |
| assembly { tokenCode := extcodesize(token) } // contract code size | |
| // is it a contract and does it implement balanceOf | |
| if (tokenCode > 0 && token.call(bytes4(0x70a08231), user)) { | |
| return Token(token).balanceOf(user); | |
| } else { | |
| return 0; | |
| } | |
| } | |
| /* | |
| Check the token balances of a wallet for multiple tokens. | |
| Pass 0x0 as a "token" address to get TRX balance. | |
| Possible error throws: | |
| - extremely large arrays for user and or tokens (gas cost too high) | |
| Returns a one-dimensional that's user.length * tokens.length long. The | |
| array is ordered by all of the 0th users token balances, then the 1th | |
| user, and so on. | |
| */ | |
| function balances(address[] users, address[] tokens) external view returns (uint[]) { | |
| uint[] memory addrBalances = new uint[](tokens.length * users.length); | |
| for(uint i = 0; i < users.length; i++) { | |
| for (uint j = 0; j < tokens.length; j++) { | |
| uint addrIdx = j + tokens.length * i; | |
| if (tokens[j] != address(0x0)) { | |
| addrBalances[addrIdx] = tokenBalance(users[i], tokens[j]); | |
| } else { | |
| addrBalances[addrIdx] = users[i].balance; // TRX balance | |
| } | |
| } | |
| } | |
| return addrBalances; | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment