@iam4x/bsc-scan
Version:
An efficient BNB and token balance scanner
129 lines (76 loc) • 5.48 kB
Markdown
# bsc-scan
> THIS IS A FORK OF https://github.com/MyCryptoHQ/eth-scan FOR THE BINANCE SMART CHAIN
`bsc-scan` is a library written in TypeScript, to help you fetch BNB or (BEP-20) token balances for multiple addresses in an efficient way. The library uses a smart contract to fetch the balances in a single call to a node. The contract is currently deployed at [0x7E9f1Ee1905B5Bde9522c20bbb78bAbe3c3FB4ca](https://bscscan.com/address/0x7E9f1Ee1905B5Bde9522c20bbb78bAbe3c3FB4ca) on the Binance Smart Chain mainnet.
It can use Web3.js, Ethers.js, JSON-RPC (HTTP), or an EIP-1193-compatible provider to get the balances. See [Getting Started](#getting-started) for more info.
**Note**: Even though `eth_call` doesn't use any gas, the block gas limit still applies, and the maximum number of addresses you can fetch in a single call is limited. By default this library batches calls per 1000 addresses.
## Getting started
The library is published on npm. To install it, use `npm` or `yarn`:
```
yarn add @iam4x/bsc-scan
```
or
```
npm install @iam4x/bsc-scan
```
## Example
```typescript
import { getEtherBalances } from '@iam4x/bsc-scan';
getEtherBalances('http://127.0.0.1:8545', [
'0x9a0decaffb07fb500ff7e5d253b16892dbec006a',
'0xeb65f72a2f5464157288ac15f1bb56c56e6be375',
'0x1b96c634f9e9fcfb76932e165984901701352ffd',
'0x740539b55ee5dc58efffb88fea44a9008f8daa6f',
'0x95d9e32dc03770699a6a5e5858165b174d500015'
]).then(console.log);
```
Results in:
```typescript
{
'0x9a0decaffb07fb500ff7e5d253b16892dbec006a': BigInt(1000000000000000000),
'0xeb65f72a2f5464157288ac15f1bb56c56e6be375': BigInt(1000000000000000000),
'0x1b96c634f9e9fcfb76932e165984901701352ffd': BigInt(1000000000000000000),
'0x740539b55ee5dc58efffb88fea44a9008f8daa6f': BigInt(1000000000000000000),
'0x95d9e32dc03770699a6a5e5858165b174d500015': BigInt(1000000000000000000)
}
```
## API
### `getEtherBalances(provider, addresses, options)`
Get Ether balances for `addresses`.
* `provider` \<[Provider](#providers)\> - A Web3 instance, Ethers.js provider, JSONRPC endpoint, or EIP-1193 compatible provider
* `addresses` \<string[]\> - An array of addresses as hexadecimal string.
* `options` \<[EthScanOptions](#ethscanoptions)\> (optional) - The options to use.
* Returns: \<Promise<[BalanceMap](#balancemap)>\> - A promise with an object with the addresses and the balances.
### `getTokenBalances(provider, addresses, token, options)`
Get ERC-20 token balances from `token` for `addresses`. This does not check if the address specified is a token and will throw an error if it isn't.
* `provider` \<[Provider](#providers)\> - A Web3 instance, Ethers.js provider, JSONRPC endpoint, or EIP-1193 compatible provider
* `addresses` \<string[]\> - An array of addresses as hexadecimal string.
* `token` \<string\> - The address of the ERC-20 token.
* `options` \<[EthScanOptions](#ethscanoptions)\> (optional) - The options to use.
* Returns: \<Promise<[BalanceMap](#balancemap)>\> - A promise with an object with the addresses and the balances.
### `getTokensBalance(provider, address, tokens, options)`
Get ERC-20 token balances from `tokens` for `address`. If one of the token addresses specified is not a token, a balance of 0 will be used.
* `provider` \<[Provider](#providers)\> - A Web3 instance, Ethers.js provider, JSONRPC endpoint, or EIP-1193 compatible provider
* `address` \<string\> - The address to get token balances for.
* `tokens` \<string[]\> - An array of ERC-20 token addresses.
* `options` \<[EthScanOptions](#ethscanoptions)\> (optional) - The options to use.
* Returns: \<Promise<[BalanceMap](#balancemap)>\> - A promise with an object with the addresses and the balances.
## `getTokensBalances(provider, addresses, tokens, options)`
* `provider` \<[Provider](#providers)\> - A Web3 instance, Ethers.js provider, JSONRPC endpoint, or EIP-1193 compatible provider.
* `addresses` \<string[]\> - An array of addresses as hexadecimal string.
* `tokens` \<string[]\> - An array of ERC-20 token addresses.
* `options` \<[EthScanOptions](#ethscanoptions)\> (optional) - The options to use.
* Returns: \<Promise<[BalanceMap](#balancemap)\<[BalanceMap](#balancemap)\>>\> - A promise with an object with the addresses and the balances.
### `EthScanOptions`
* `contractAddress` \<string\> (optional) - The address of the smart contract to use. Defaults to [0x86f25b64e1fe4c5162cdeed5245575d32ec549db](https://etherscan.io/address/0x86f25b64e1fe4c5162cdeed5245575d32ec549db).
* `batchSize` \<number\> (optional) - The size of the call batches. Defaults to 1000.
### `BalanceMap`
A `BalanceMap` is an object with an address as key and a [bigint](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt) as value.
### Providers
Currently, `bsc-scan` has support for four different providers:
* Ethers.js, by using an existing Ethers.js provider
* Web3, by using an instance of the `Web3` class
* HTTP, by using a URL of a JSONRPC endpoint as string
* EIP-1193 compatible provider, like `window.ethereum`
## Compatiblity
`bsc-scan` uses ES6+ functionality, which may not be supported on all platforms. If you need compatibility with older browsers or Node.js versions, you can use something like [Babel](https://github.com/babel/babel).
There is an ES compatible version available, which should work with module bundlers like [Webpack](https://webpack.js.org/) and [Rollup](https://github.com/rollup/rollup).