Skip to content

Instantly share code, notes, and snippets.

@fogmoon
Created May 25, 2022 06:32
Show Gist options
  • Select an option

  • Save fogmoon/234b0b070016fc54e87642c52aa3095f to your computer and use it in GitHub Desktop.

Select an option

Save fogmoon/234b0b070016fc54e87642c52aa3095f to your computer and use it in GitHub Desktop.
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