Web3j 和 Uniswap Router V2,将 wei 转换为 uint256

问题描述

我遇到的问题是我试图将 wei 中的值发送到 swapExactETHForTokens,但它返回 Fail with error 'UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT'。如果我将 1 ETH 转换为 wei(在代码中),它会显示1000000000000000000。从 Uniswap GUI 进行交换时,它会将 1 ETH 变为 1059503741842561918508100943433。 我将把我的代码放在下面,我想我会研究 Uniswap 前端项目,看看它是如何将 GUI 中的 1 ETH 转换为该值的(我猜它还在调用智能合约之前增加了费用)

  web3j = Web3j.build(web3jService);
        UniswapV2Router02 uniSwapRouter = UniswapV2Router02.load(UNISWAP_V2_RINKEBY,web3j,credentials,new DefaultGasProvider());
        uniSwapRouter.swapExactETHForTokens(
                Convert.toWei("1",Convert.Unit.ETHER).toBigInteger(),Arrays.asList(WETH_ADDRESS,DAI_ADDRESS),credentials.getAddress(),BigInteger.valueOf(DEADLINE_TIMESTAMP)).send();

我将尝试什么:

  • 尝试将金额转换为 uint256、尾随零和所有(但不确定如何)
  • 看看前端是怎么做的,不确定我是否应该直接调用swapExactETHForTokens,而不是先调用其他函数

所以一些问题是:

  • 如何将 1 ETH 的值转换为表示该 uint256 数字的 BigInteger?
  • 我应该事先调用其他函数吗?
  • 如何设置燃气?我猜通过new DefaultGasProvider()
  • 我看到他们在 Javascript 中执行类似 const MIN_TOKENS = web3.utils.toHex(0.2 * 10 ** 18) 的操作,我如何才能在 Web3 中执行此操作而不会被黑客攻击并添加尾随零?

提前谢谢你,祝你有美好的一天, 索林

解决方法

有趣的是,在此处发布问题如何有助于回避问题,不是吗?

查看合约,上面写着 msg.value。你猜怎么着,我们不会发送那个。即使 swapExactEthForTokens 是应付款项,包装器也不会为其生成参数。

关注此错误以获取更多信息:https://github.com/web3j/web3j/issues/1268

我基本上是用 0 以太币发送交易,它返回 INSUFFICIENT_INPUT_AMOUNT。认为如果 Java Wrapper 只给我第一个金额,它会自动处理它,但没有。

我必须手动将 weiValue 添加到 executeRemoteCallTransaction(function,weiValue) 因为包装器没有这样做,请查看上面的错误报告。

无论如何,如果有人想提供更多见解,我会保持开放状态。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...