import BigNumber from 'bignumber.js' import { Contract } from 'ethers' import { JsonRpcProvider } from '@ethersproject/providers' import { SOR as SOR2, SwapTypes, DisabledOptions, SwapOptions, PoolFilter, fetchSubgraphPools } from '@balancer-labs/sor2' const abi = require('./abi') const addr = '0xBA12222222228d8Ba445958a75a0704d566BF2C8' const provider = new JsonRpcProvider( `https://mainnet.infura.io/v3/${process.env.INFURA}` ) const DAI = '0x6B175474E89094C44Da98b954EedeAC495271d0F' const USDC = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' let sor: SOR2 async function initSor2(): Promise { const network = await provider.getNetwork() const chainId = network.chainId const maxPools = 100 const disableOptions: DisabledOptions = { isOverRide: false, disabledTokens: [] } const poolsSourceV2 = `https://storageapi.fleek.co/johngrantuk-team-bucket/poolsV2.json` const subgraphPoolsV2 = `https://api.thegraph.com/subgraphs/name/balancer-labs/balancer-v2` const sor2 = new SOR2( provider, gasPrice, maxPools, chainId, poolsSourceV2, swapCost, disableOptions ) const subgraphPools = await fetchSubgraphPools(subgraphPoolsV2) const isPoolFetched = await sor2.fetchPools(true, subgraphPools) if (!isPoolFetched) throw new Error('Should fetch pool') return sor2 } async function swap(swapType: SwapTypes, tokenIn: string, tokenOut: string, amountIn: BigNumber, gasPrice: BigNumber, swapCost: BigNumber) { if (!sor) { sor = await initSor2() } const swapOptions: SwapOptions = { poolTypeFilter: PoolFilter.All, timestamp: Math.floor(Date.now() / 1000) } await sor.setCostOutputToken( tokenOut, 6, swapCost ) const swapInfo2 = await sor.getSwaps( tokenIn, tokenOut, swapType, amountIn, swapOptions ) const vault = new Contract(addr, abi, provider) if (swapInfo2.swaps.length > 1) { console.log('Multi hop') } else { console.log('Single hop') } console.log('Swap return:') console.log(swapInfo2) const amounts = await vault.callStatic[ 'queryBatchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool))' ]( swapType, swapInfo2.swaps, swapInfo2.tokenAddresses, [ addr, false, addr, false ] ) console.log('Query result:') console.log(amounts.map((a) => a.toString())) } const amountIn = new BigNumber('1') const gasPrice = new BigNumber('30000000000') const swapCost = new BigNumber('1000000') console.log('Swap 1 usdc to ? dai') swap(SwapTypes.SwapExactIn, USDC, DAI, amountIn, gasPrice, swapCost) .then(() => { console.log('Swap ? usdc to 1 dai') return swap(SwapTypes.SwapExactOut, USDC, DAI, amountIn, gasPrice, swapCost) }) .catch(console.error)