decred.org/dcrdex@v1.0.5/dex/networks/eth/contracts/MultiBalanceV0.sol (about) 1 // SPDX-License-Identifier: BlueOak-1.0.0 2 // pragma should be as specific as possible to allow easier validation. 3 pragma solidity = 0.8.18; 4 5 contract MultiBalanceV0 { 6 bytes4 private constant BALANCE_OF_SELECTOR = bytes4(keccak256("balanceOf(address)")); 7 8 // balances gets the balance of the account and multiple tokens at once. 9 function balances(address acct, address[] calldata tokenAddresses) 10 public view 11 returns (uint256[] memory) 12 { 13 14 uint256[] memory bals = new uint256[](tokenAddresses.length + 1); 15 bals[0] = acct.balance; 16 for (uint256 i; i < tokenAddresses.length; i++) { 17 address contractAddr = tokenAddresses[i]; 18 bool success; 19 bytes memory data; 20 (success, data) = contractAddr.staticcall(abi.encodeWithSelector(BALANCE_OF_SELECTOR, acct)); 21 require(success, "balanceOf call failed"); 22 uint256 bal; 23 (bal) = abi.decode(data, (uint256)); 24 bals[i + 1] = bal; 25 } 26 return bals; 27 } 28 }