Contract-Development

從合約中呼叫 swapExactETHForTokens 並使用合約餘額支付

  • September 9, 2021

我開始學習solidity,所以這可能是一個非常基本的問題,但我找不到足夠的說明。

我的目標是PancakeSwap/UniSwap使用ETH我的智能合約餘額購買代幣。合約有足夠的ETH餘額用於掉期。

如果可能的話,我想把它換成ETH一些TokenA,而不是不得不使用WETH,因為我認為這會更容易,因為selfdestruct如果我沒有任何代幣,我可以輕鬆收回我所有的資金。

我正在嘗試swapExactETHForTokens按如下方式呼叫路由器:

   function swap() public {
       uint deadline = block.timestamp + 100;
       address[] memory path = new address[](2);
       path[0] = address(WBNB);
       path[1] = address(target);
       pancakeRouter.swapExactETHForTokens(0, path, owner, deadline);
   }

問題是我沒有足夠的資金,這是有道理的,因為我沒有指定ETH我想要交易的數量。我想我可以通過將此功能設為應付並發送ETH我想要交易的金額來解決這個問題。( https://uniswap.org/docs/v2/smart-contracts/router02/ )

然而,這不是我想要達到的。我想用合約的餘額來執行這個交易。實現這一目標的最簡單/最快/更少氣體密集度的方法是什麼?

謝謝。

編輯:

我認為我沒有足夠強調將契約餘額用作資金的必要性。我知道預期的用途是ETH與 tx 一起發送,而不是ETH直接向合約發送任何內容。

為什麼我要使用 SC 中的資金?因為通過這種方式,例如,我可以向執行此交換呼叫的合約發送 100 筆交易,並且只有其中一個會成功執行,因為樂趣有限。所以我想我應該換WBNB嗎?

如果您在函式呼叫中發送乙太幣,您應該能夠實現這一點。在 solc v0.8 中,您可以使用函式呼叫選項來實現{value: amount}

生成的函式應如下所示:

function swap() public {
   uint deadline = block.timestamp + 100;
   address[] memory path = new address[](2);
   path[0] = address(WBNB);
   path[1] = address(target);

   // Send all balance
   uint256 amount = address(this).balance;

   // TODO: Check the result
   pancakeRouter.swapExactETHForTokens{value: amount}(0, path, owner, deadline);
}
  1. 您不需要將資金發送到您的智能合約。把它們放在你的錢包裡。合約應該可以用於任何賬戶。您向它發送參數,它會為您執行它們。
  2. 查看 Pancake 交換或 Uniswap UI 並輸入您要交換的代幣(請參見下面的 url)。他們是否將路線顯示為:

**BNB 到所需的代幣?

或 **WBNB 到所需的令牌?

大多數時候,最常見的貨幣對是 ERC20 與 ERC20。看看這個合約,如果有更好的流動性,它將通過 WETH。https://cryptomarketpool.com/how-to-swap-tokens-on-uniswap-using-a-smart-contract/

函式 swapExactETHForTokens(uint amountOutMin, 地址

$$ $$calldata 路徑,地址,uint 截止日期)外部應付回報(uint$$ $$記憶體量);複製 沿著路徑確定的路線,為盡可能多的輸出代幣交換準確數量的 ETH。path 的第一個元素必須是 WETH,最後一個是輸出令牌,任何中間元素都表示要交易的中間對(例如,如果不存在直接對)。https://uniswap.org/docs/v2/smart-contracts/router02/#swapexactethfortokens

引用自:https://ethereum.stackexchange.com/questions/99983