繁体   English   中英

如何在 web3 中发送交易前计算滑点百分比?

[英]How to calculate slippage percent before send transaction in web3?

每次我想检查滑点,我都必须先发送交易,如果交易因为“INSUFFICIENT_OUTPUT_AMOUNT”而失败,我知道这个滑点比我预期的要高,但是我为此损失了费用,它需要费气我赔了钱,如何查看 web3 中的滑点百分比? 或者有任何图书馆可以帮助我解决这个问题吗? 这是我在 web3 中使用 pancakeswap 智能合约的简单交易代码。

...
amount_out = contract.functions.getAmountsOut(amountBNB, [spend,tokenToBuy]).call()[-1]
        min_tokens = int(amount_out * (1 - (slippage / 100)))
...
 pancakeswap2_txn = contract.functions.swapExactETHForTokens(
            min_tokens,
            [spend,tokenToBuy],
            sender_address,
            (int(time.time()) + 10000)
            ).buildTransaction({
            'from': sender_address,
            'value': web3.toWei(price,'ether'),
            'gas': gas_limit,
            'gasPrice': web3.toWei(gasPriceEntry.get(),'gwei'),
            'nonce': nonce,
            })
...

注释掉“'gas': gas_limit”部分。

我不记得为什么了,但是如果不设置“gas”参数,你应该会得到同样的错误,你现在可以在区块链上看到这个错误 + 你已经在执行代码时支付了费用。 这样您就知道错误是什么,但没有发送实际交易,因此您无需支付 gas/交易费。

接下来,如果您打算在滑点低于您的最大滑点预期(例如低于 10%)的情况下执行交易,您可以考虑下一个程序。 如果不是“知道最小滑点然后使用它”,而是尝试“找到最小滑点并执行交易”怎么办?

下一个程序能否帮助您:

  • for循环的使用
  • 默认滑点为 1%,设置 maxSlippageAllowed(例如 10%)
  • run for 循环,每次不成功的交易执行(我们假设因为滑点低)增加滑点 +1%
  • 运行循环,直到交易达到:1.) 在达到滑点时成功执行 (break),或 2.) 达到允许的最大滑点 (break)

但是,请记住,如果您将“gas”参数保留在您的swapExactETHForTokens中,您将通过 for 循环为每次执行支付所有 gas 费用!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM