UNPKG

@phiresky/eth-scan

Version:

An efficient Ether and token balance scanner

2 lines 5.22 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.fixture=void 0;var _IERC=_interopRequireDefault(require("@openzeppelin/contracts/build/contracts/IERC20.json")),_hardhat=require("hardhat"),_BalanceScanner=_interopRequireDefault(require("../artifacts/contracts/BalanceScanner.sol/BalanceScanner.json")),_ERC20InvalidMock=_interopRequireDefault(require("../artifacts/contracts/mocks/ERC20InvalidMock.sol/ERC20InvalidMock.json")),_ethScan=require("./eth-scan");function _interopRequireDefault(a){return a&&a.__esModule?a:{default:a}}const{deployContract,deployMockContract,createFixtureLoader,provider}=_hardhat.waffle,loadFixture=createFixtureLoader(provider.getWallets(),provider),fixture=async(a,b)=>{const c=a[0],d=await deployContract(c,_BalanceScanner.default),e=await deployMockContract(c,_IERC.default.abi),f=await deployMockContract(a[0],_IERC.default.abi);await f.mock.balanceOf.returns("1000");const g=await deployMockContract(a[0],_IERC.default.abi);await g.mock.balanceOf.returns("1");const h=await Promise.all(a.slice(1).map(a=>a.getAddress())),i=await deployContract(c,_ERC20InvalidMock.default,[h[0],1e3]);return{contract:d,signers:a,addresses:h,provider:b,token:e,tokenA:f,tokenB:g,invalidToken:i}};exports.fixture=fixture,describe("eth-scan",()=>{describe("getEtherBalances",()=>{it("returns the ether balances for multiple addresses as a BalanceMap",async()=>{const{contract:a,addresses:b}=await loadFixture(fixture),c=await(0,_ethScan.getEtherBalances)(_hardhat.ethers.provider,b,{contractAddress:a.address});for(const a of b){const b=BigInt((await _hardhat.ethers.provider.getBalance(a)).toHexString());expect(b).toBe(c[a])}})}),describe("getTokenBalances",()=>{it("returns the token balances of one token, for multiple addresses",async()=>{const{contract:a,addresses:b,token:c}=await loadFixture(fixture);await c.mock.balanceOf.returns("1000");const d=await(0,_ethScan.getTokenBalances)(_hardhat.ethers.provider,b,c.address,{contractAddress:a.address});for(const a of b)expect(d[a]).toBe(1000n)}),it("does not throw for invalid contracts",async()=>{const{contract:a,addresses:b,token:c}=await loadFixture(fixture);await expect(()=>(0,_ethScan.getTokenBalances)(_hardhat.ethers.provider,b,c.address,{contractAddress:a.address})).not.toThrow()}),it("retries failed contract calls",async()=>{const{contract:a,addresses:b,invalidToken:c}=await loadFixture(fixture),d=await(0,_ethScan.getTokenBalances)(_hardhat.ethers.provider,[b[0],b[1]],c.address,{contractAddress:a.address});expect(d[b[0]]).toBe(1000n),expect(d[b[1]]).toBe(0n)})}),describe("getTokensBalances",()=>{it("returns multiple token balances, for multiple addresses",async()=>{const{contract:a,signers:b,addresses:c,tokenA:d,tokenB:e}=await loadFixture(fixture),f=await(0,_ethScan.getTokensBalances)(_hardhat.ethers.provider,c,[d.address,e.address],{contractAddress:a.address});for(const a of c)expect(Object.keys(f[a])).toHaveLength(2),expect(Object.keys(f[a])[0]).toBe(d.address),expect(Object.keys(f[a])[1]).toBe(e.address),expect(f[a][d.address]).toBe(1000n),expect(f[a][e.address]).toBe(1n)}),it("does not throw for invalid contracts",async()=>{const{contract:a,signers:b,addresses:c}=await loadFixture(fixture),d=await deployMockContract(b[0],_IERC.default.abi),e=await deployMockContract(b[0],_IERC.default.abi);await expect(()=>(0,_ethScan.getTokensBalances)(_hardhat.ethers.provider,c,[d.address,e.address],{contractAddress:a.address})).not.toThrow()}),it("retries failed contract calls",async()=>{const{contract:a,addresses:b,token:c,tokenA:d,invalidToken:e}=await loadFixture(fixture),f=await(0,_ethScan.getTokensBalances)(_hardhat.ethers.provider,[b[0],b[1]],[d.address,e.address,c.address],{contractAddress:a.address});expect(f[b[0]][c.address]).toBe(0n),expect(f[b[0]][d.address]).toBe(1000n),expect(f[b[0]][e.address]).toBe(1000n),expect(f[b[1]][c.address]).toBe(0n),expect(f[b[1]][d.address]).toBe(1000n),expect(f[b[1]][e.address]).toBe(0n)})}),describe("getTokensBalance",()=>{it("returns multiple token balances for a single address",async()=>{const{contract:a,addresses:b,tokenA:c,tokenB:d}=await loadFixture(fixture),e=await(0,_ethScan.getTokensBalance)(_hardhat.ethers.provider,b[0],[c.address,d.address],{contractAddress:a.address});expect(Object.keys(e)).toHaveLength(2),expect(Object.keys(e)[0]).toBe(c.address),expect(Object.keys(e)[1]).toBe(d.address),expect(e[c.address]).toBe(1000n),expect(e[d.address]).toBe(1n)}),it("does not throw for invalid contracts",async()=>{const{contract:a,signers:b,addresses:c}=await loadFixture(fixture),d=await deployMockContract(b[0],_IERC.default.abi),e=await deployMockContract(b[0],_IERC.default.abi);await expect(()=>(0,_ethScan.getTokensBalance)(_hardhat.ethers.provider,c[0],[d.address,e.address],{contractAddress:a.address})).not.toThrow()}),it("retries failed contract calls",async()=>{const{contract:a,addresses:b,token:c,tokenA:d,invalidToken:e}=await loadFixture(fixture),f=await(0,_ethScan.getTokensBalance)(_hardhat.ethers.provider,b[0],[c.address,d.address,e.address],{contractAddress:a.address});expect(f[c.address]).toBe(0n),expect(f[d.address]).toBe(1000n),expect(f[e.address]).toBe(1000n)})})}); //# sourceMappingURL=eth-scan.test.js.map