1

我会试着解释一下我的情况...

我将尝试用 Moralis 和 Fasitify 在后面和 VueJS 在前面制作一个 web3 钱包。

(我想说我已经在 Web 客户端(vuejs)中做到了这一点,并且一切正常!)

我开始 :

在我的背后,我从用户那里获取所有资产。它有效,我把它们都搞定了,我可以把它们送回前线

但是我需要对数据进行处理/排序,只恢复其中的一部分并发送到前面,以避免在前面做太多的处理,减少你的工作量。

我这样做:

*handlers/token.js*

const getTokenBalances = async () => {
  let userTokens;
  const options = {
    chain: "bsc",
    address: "0x935A438C29bd810c9aBa2F3Df5144d2dF4F3c0A0",
  };
  userTokens = await Moralis.Web3API.account.getTokenBalances(options);
 
  return userTokens;
};

如果我返回 userTokens,我会在 Postman 中使用它。但现在,我做了类似的事情:

const getTokenBalances = async (tokens) => {
  let userTokens;
  let userBalances = [];
  const options = {
    chain: "bsc",
    address: "0x935A438C29bd810c9aBa2F3Df5144d2dF4F3c0A0",
  };
  userTokens = await Moralis.Web3API.account.getTokenBalances(options);
  userTokens.forEach((token) => {
    if (
      !token.name.match(/^.*\.io/) &&
      !token.name.match(/^.*\.IO/) &&
      !token.name.match(/^.*\.net/) &&
      !token.name.match(/^.*\.Net/) &&
      !token.name.match(/^.*\.com/) &&
      !token.name.match(/^.*\.org/)
    ) {
      getTokenPair(token).then((value) => {
        if (value > 2) {
          checkTokenPrice(token).then((price) => {
            if (price > 0.001) {
              userBalances.push(token);
            }
          });
        }
      });
    }
  });
  userBalances.sort((a, b) => {
    return b.total_value_usd - a.total_value_usd;
  });

  return userBalances;
};
   

userBalances我在邮递员的回复中总是空的(我不明白为什么?)

getTokenPair 函数:

const getTokenPair = async (token) => {
  const BNBTokenAddress = "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c"; //BNB
  const options = {
    token0_address: token.token_address,
    token1_address: BNBTokenAddress,
    exchange: "pancakeswapv2",
    chain: "bsc",
  };
  try {
    const pairAddress = await Moralis.Web3API.defi.getPairAddress(options);
    let amount = 0;
    //console.log("token pairAddress : " + pairAddress.pairAddress);
    if (pairAddress.token1.symbol === "BUSD") {
      try {
        let reserve = await getPairReserves(pairAddress.pairAddress);
        amount += reserve / 10 ** 18;
      } catch (err) {
        console.log("error getReservesBUSD : " + err);
      }
    }
    if (pairAddress.token1.symbol === "WBNB") {
      try {
        let reserve = await getPairReserves(pairAddress.pairAddress);
        amount += reserve / 10 ** 18;
      } catch (err) {
        console.log("error getReservesWBNB : " + err);
      }
    }
    //console.log("amount : " + amount)
    return amount;
  } catch (err) {
    console.log("error getPair : " + err);
  }
};

和 checkTokenPrice 函数:

const checkTokenPrice = async (token) => {
  let price;
  const options = {
    address: token.token_address,
    chain: "bsc",
    exchange: "PancakeSwapv2",
  };
  try {
    const priceToken = await Moralis.Web3API.token.getTokenPrice(options);
    price = priceToken.usdPrice.toFixed(7);
    token.price = priceToken.usdPrice.toFixed(7);
    token.balance = insertDecimal(token.balance, token.decimals);

    token.total_value_usd = (token.balance * token.price).toFixed(2);

    return price;
  } catch (err) {
    console.log("error tokenPrice : " + err);
  }
};

它们是我使用的所有功能中的 await 方法,因此可能存在连接。

谢谢你的帮助!

**** 编辑 *****

我这样解决我的问题:

const getTokenBalances = async () => {
  let userTokens;
  let userBalances = [];
  const options = {
    chain: "bsc",
    address: "0x935A438C29bd810c9aBa2F3Df5144d2dF4F3c0A0",
  };
  userTokens = await Moralis.Web3API.account.getTokenBalances(options);

  for (token of userTokens) {
    if (
      !token.name.match(/^.*\.io/) &&
      !token.name.match(/^.*\.IO/) &&
      !token.name.match(/^.*\.net/) &&
      !token.name.match(/^.*\.Net/) &&
      !token.name.match(/^.*\.com/) &&
      !token.name.match(/^.*\.org/)
    ) {
      let value = await getTokenPair(token);
      if(value > 2) {
        let price = await checkTokenPrice(token);
        if (price > 0.001) {
          userBalances.push(token);
        }
      }
    }
  }
 
  return userBalances;
};

谢谢您的帮助 !;)

4

0 回答 0