Search code examples
node.jsblockchainethereum

How can I store the value of a promise and use it once resolved?


I am currently developing an app which interacts with uniswap, and I have developed a Wrapper class to contain the info and variables I'll need about some pair (e.g DAI/WETH).

As some of this values are asynchronous, I have coded a build() async function to get those before calling the constructor, so I can store them. I want to store the result of this build function, which is an instance of the class I have defined, inside a variable to use it later, but I need to know whether the Promise that that build function returns is resolved before using it, so how can I make it?

Here is the code of the class:

'use strict'
const { ChainId, Fetcher, WETH, Route, Trade, TokenAmoun, TradeType, TokenAmount } = require('@uniswap/sdk')
const { toChecksumAddress } = require('ethereum-checksum-address')
const Web3 = require('web3')
const web3 = new Web3()
const chainId = ChainId.MAINNET;
let tok1;
let tok2;
let pair;
let route;
let trade;

class UniswapTokenPriceFetcher
{
    constructor(async_params)
    {
        async_params.forEach((element) => {
            if (element === 'undefined')
            {
                throw new Error('All parameters must be defined')
            }
        });

        this.trade = async_params[0];
        this.route = async_params[1];
        this.pair = async_params[2];
        this.tok1 = async_params[3];
        this.tok2 = async_params[4];
    }

    static async build(token1, token2)
    {
        
        var tok1 = await Fetcher.fetchTokenData(chainId, toChecksumAddress(token1))
        var tok2 = await Fetcher.fetchTokenData(chainId, toChecksumAddress(token2))
        var pair = await Fetcher.fetchPairData(tok1, tok2)
        var route = new Route([pair], tok2)
        var trade =  new Trade(route, new TokenAmount(tok2, web3.utils.toWei('1', 'Ether')), TradeType.EXACT_INPUT)
        return new UniswapTokenPriceFetcher([trade, route, pair, tok1, tok2])

    }

    getExecutionPrice6d = () =>
    {
        return this.trade.executionPrice.toSignificant(6);     
    }

    getNextMidPrice6d = () =>
    {
        return this.trade.nextMidPrice.toSignificant(6);     
    }
}




module.exports = UniswapTokenPriceFetcher

Thank you everybody!

EDIT: I know Uniswap only pairs with WETH so one of my token variables is unneccesary, but the problem remains the same! Also keep in mind that I want to store an instance of this class for latter use inside another file.


Solution

  • You should either call the build function with await

    const priceFetcher = await UniswapTokenPriceFetcher.build(token1, token2)
    

    or followed by then

    UniswapTokenPriceFetcher.build(token1, token2).then(priceFetcher => {...})
    

    I don't see any other way.