從合約中呼叫 swapExactETHForTokens 並使用合約餘額支付
我開始學習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); }
- 您不需要將資金發送到您的智能合約。把它們放在你的錢包裡。合約應該可以用於任何賬戶。您向它發送參數,它會為您執行它們。
- 查看 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