Solidity

如何編寫一個接受 ERC20 代幣作為支付的 Solidity 函式?

  • July 20, 2021

有一個 ERC20 代幣(契約 1 - 我不擁有它。)並且這些代幣用於支付我的服務契約(契約 2)中的服務。

如果使用者從錢包觸發發送操作,我可以使用元遮罩輕鬆地將合約 1 令牌從使用者擁有的帳戶發送到合約 2。

但是,我希望使用者點擊我的 Dapp 上的一個按鈕,該按鈕將呼叫我的服務契約 2 中的一個函式,然後觸髮使用者以他們選擇的 ERC20 代幣(即契約 1)為產品付款。

解決這個問題的最佳方法是什麼,因為msg.valuemsg.senderaddress(this).balance專門針對乙太幣而不是代幣的……

我如何確保使用函式以正確的 ERC20 代幣支付智能合約?

我已經為 ERC223 嘗試過這個解決方案,但它不適用於這種情況,因為我需要留在 ERC20:Accepting an ERC20 Token as Payment

無論如何我可以在不改變標準的情況下做到這一點嗎?

範常式式碼,

function stake(address _token, uint256 amount)
       external
   {
       require(amount > 0, "Cannot stake 0");
       _totalSupply = _totalSupply.add(amount);
       _balances[msg.sender] = _balances[msg.sender].add(amount);
       // Before this you should have approved the amount 
       // This will transfer the amount of  _token from caller to contract
       IERC20(_token).transferFrom(msg.sender, address(this), amount);
       emit Staked(msg.sender, amount);
   }

您不能執行這樣的功能,因為令牌以另一種方式工作。你可以做的是兩步支付,這是 DeFi 領域的經典方式。

首先,您應該讓使用者批准他的代幣,以便合約可以代表使用者使用他的代幣。這是通過呼叫approveERC20 合約的函式來完成的。

然後你應該transferFrom從你的contract2的“接受付款”的函式中呼叫合約1的函式。使用者只需呼叫此函式即可使用他的代幣支付服務費用。

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