eattheblocks icon indicating copy to clipboard operation
eattheblocks copied to clipboard

TypeError: Token.fetchData is not a function

Open hlairboltons opened this issue 4 years ago • 12 comments

Hello I am following the pro course on profitable-arbitrage, 15 Poll Uniswap Prices. When i run run-arbitrage.js I get the following error. What does this mean and how I proceed? Thanks

Blair@DESKTOP-L81FL5C MINGW64 ~/profitable-flashloans $ node run-arbitrage.js C:\Users\Blair\profitable-flashloans\run-arbitrage.js:24 Token.fetchData( ^ TypeError: Token.fetchData is not a function at C:\Users\Blair\profitable-flashloans\run-arbitrage.js:24:19 at Array.map () at init (C:\Users\Blair\profitable-flashloans\run-arbitrage.js:23:55) at Object. (C:\Users\Blair\profitable-flashloans\run-arbitrage.js :78:1) at Module._compile (node:internal/modules/cjs/loader:1109:14) at Object.Module._extensions..js (node:internal/modules/cjs/loader:1138:10) at Module.load (node:internal/modules/cjs/loader:989:32) at Function.Module._load (node:internal/modules/cjs/loader:829:14) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_ma in:76:12) at node:internal/main/run_main_module:17:47

hlairboltons avatar May 10 '21 07:05 hlairboltons

Having the same problem ....... any solution?

antonmn avatar May 11 '21 02:05 antonmn

I think uniswap SDK v2 has new features and no longer supports fetchdata method. So try to use Fetcher.fetchTokenData and Fetcher.fetchPairData.

cherylkw avatar Jun 10 '21 07:06 cherylkw

@cherylkw you da man! It worked perfectly

RolandoDrRobot avatar Jun 18 '21 22:06 RolandoDrRobot

Hi all....I am having the same issue as detailed in the thread above! When I install UniSwap SDK I am installing v3? Is there anyway to install a specific SDK version, and also it would appear that SDK v2 allows Fetcher.fetchTokenData and Fetcher.fetchPairData and appeared to work...if so what was the code amendment please?

supergav1967 avatar Jul 28 '21 17:07 supergav1967

I think uniswap SDK v2 has new features and no longer supports fetchdata method. So try to use Fetcher.fetchTokenData and Fetcher.fetchPairData.

@cherylkw you da man! It worked perfectly

Hi there. What was the code amendments you made please>

supergav1967 avatar Jul 28 '21 17:07 supergav1967

from Batman, in another thread So you have installed uniswap/sdk @3.0.3 The code requires uniswap/sdk @2.0.5 You can install specific ersions like this: Npm install @uniswap/[email protected]

NumberXXIV avatar Aug 28 '21 18:08 NumberXXIV

@NumberXXIV thanks so much this worked

jt311 avatar Sep 15 '21 02:09 jt311

To elaborate a bit for those in the tutorial who may not be aware of every aspect of object oriented coding structures. If you installed using @uniswap/sdk, and did not indicate a version as of 10/22/2021, you would have installed version 3.0.3.

In this case, in the const used to import values from uniswap (at the top of the code), you'll need to replace the "Token" and "Pair" statements with a single "Fetcher" statement. Then, within your methods in the code, replace "Token.fetchData" and "Pair.fetchData" with "Fetcher.fetchTokenData" and "Fetcher.fetchPairData"

It should look like this, const { ChainId, TokenAmount, Fetcher } = require('@uniswap/sdk'); //import field values from uniswap

Then, within your method,

const init = async () => { //Apply WETH to process - In Uniswap, weth is used to trade ETH. ETH is sent to a weth token and the weth token is used to represent ETH during the trade. const [dai, weth] = await Promise.all( [addresses.tokens.dai, addresses.tokens.weth].map(tokenAddress => ( Fetcher.fetchTokenData( ChainId.MAINNET, tokenAddress, ) ))); const daiWeth = await Fetcher.fetchPairData( dai, weth );

To @wcDogg's point... EatTheBlocks course designers need to modify these details in the instructions or provide additional training on how we can manage version changes for the many different npm installs that are required for the build. It's an expensive course and it's no surprise that people will be frustrated on this one.

scottbailey1234 avatar Oct 22 '21 16:10 scottbailey1234

require('dotenv').config() const Web3 = require('web3'); const { ChainId, TokenAmount, Fetcher } = require('@uniswap/sdk'); const abis = require('./abis'); const { mainnet: addresses } = require('./addresses');

const web3 = new Web3( new Web3.providers.WebsocketProvider('process.env.INFURA_URL') );

const kyber = new web3.eth.Contract( abis.kyber.kyberNetworkProxy, addresses.kyber.kyberNetworkProxy );

const AMOUNT_ETH = 100; const RECENT_ETH_PRICE = 230; const AMOUNT_ETH_WEI = web3.utils.toWei(AMOUNT_ETH.toString()); const AMOUNT_DAI_WEI = web3.utils.toWei((AMOUNT_ETH * RECENT_ETH_PRICE).toString());

const init = async () => { const [dai, weth] = await Promise.all( [addresses.tokens.dai, addresses.tokens.weth].map(tokenAddress => ( Fetcher.fetchTokenData( ChainId.MAINNET, tokenAddress, ) ))); daiWeth = await Fetcher.fetchPairData( dai, weth, );

web3.eth.subscribe('newBlockHeaders') .on('data', async block => { console.log(New block received. Block # ${block.number});

  const kyberResults = await Promise.all([
      kyber
        .methods
        .getExpectedRate(
          addresses.tokens.dai, 
          '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', 
          AMOUNT_DAI_WEI
        ) 
        .call(),
      kyber
        .methods
        .getExpectedRate(
          '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', 
          addresses.tokens.dai, 
          AMOUNT_ETH_WEI
        ) 
        .call()
  ]);
  const kyberRates = {
    buy: parseFloat(1 / (kyberResults[0].expectedRate / (10 ** 18))),
    sell: parseFloat(kyberResults[1].expectedRate / (10 ** 18))
  };
  console.log('Kyber ETH/DAI');
  console.log(kyberRates);

  const uniswapResults = await Promise.all([
    daiWeth.getOutputAmount(new TokenAmount(dai, AMOUNT_DAI_WEI)),
    daiWeth.getOutputAmount(new TokenAmount(weth, AMOUNT_ETH_WEI))
  ]);
  const uniswapRates = {
    buy: parseFloat( AMOUNT_DAI_WEI / (uniswapResults[0][0].toExact() * 10 ** 18)),
    sell: parseFloat(uniswapResults[1][0].toExact() / AMOUNT_ETH),
  };
  console.log('Uniswap ETH/DAI');
  console.log(uniswapRates);
})
.on('error', error => {
  console.log(error);
});

} init();

blockpartines avatar Mar 11 '22 15:03 blockpartines

from Batman, in another thread So you have installed uniswap/sdk @3.0.3 The code requires uniswap/sdk @2.0.5 You can install specific ersions like this: Npm install @uniswap/[email protected]

I was having the same issue and this solved it so easily. Thank you!!

JvBug avatar May 06 '22 15:05 JvBug

To elaborate a bit for those in the tutorial who may not be aware of every aspect of object oriented coding structures. If you installed using @uniswap/sdk, and did not indicate a version as of 10/22/2021, you would have installed version 3.0.3.

In this case, in the const used to import values from uniswap (at the top of the code), you'll need to replace the "Token" and "Pair" statements with a single "Fetcher" statement. Then, within your methods in the code, replace "Token.fetchData" and "Pair.fetchData" with "Fetcher.fetchTokenData" and "Fetcher.fetchPairData"

It should look like this, const { ChainId, TokenAmount, Fetcher } = require('@uniswap/sdk'); //import field values from uniswap

Then, within your method,

const init = async () => { //Apply WETH to process - In Uniswap, weth is used to trade ETH. ETH is sent to a weth token and the weth token is used to represent ETH during the trade. const [dai, weth] = await Promise.all( [addresses.tokens.dai, addresses.tokens.weth].map(tokenAddress => ( Fetcher.fetchTokenData( ChainId.MAINNET, tokenAddress, ) ))); const daiWeth = await Fetcher.fetchPairData( dai, weth );

To @wcDogg's point... EatTheBlocks course designers need to modify these details in the instructions or provide additional training on how we can manage version changes for the many different npm installs that are required for the build. It's an expensive course and it's no surprise that people will be frustrated on this one.

Super helpful you make my day :).

CyHunterX avatar Aug 28 '22 20:08 CyHunterX

i manage to make it work: npm uninstall @uniswap/sdk

and then

npm install @uniswap/[email protected]

miklasz avatar Oct 06 '22 00:10 miklasz