Solidity
如何編寫一個接受 ERC20 代幣作為支付的 Solidity 函式?
有一個 ERC20 代幣(契約 1 - 我不擁有它。)並且這些代幣用於支付我的服務契約(契約 2)中的服務。
如果使用者從錢包觸發發送操作,我可以使用元遮罩輕鬆地將合約 1 令牌從使用者擁有的帳戶發送到合約 2。
但是,我希望使用者點擊我的 Dapp 上的一個按鈕,該按鈕將呼叫我的服務契約 2 中的一個函式,然後觸髮使用者以他們選擇的 ERC20 代幣(即契約 1)為產品付款。
解決這個問題的最佳方法是什麼,因為
msg.value
它msg.sender
是address(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 領域的經典方式。
首先,您應該讓使用者批准他的代幣,以便合約可以代表使用者使用他的代幣。這是通過呼叫
approve
ERC20 合約的函式來完成的。然後你應該
transferFrom
從你的contract2的“接受付款”的函式中呼叫合約1的函式。使用者只需呼叫此函式即可使用他的代幣支付服務費用。