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  }