Solidity
接受 Dai 或任何 ERC20 代幣作為付款
我創建了一個 ERC20 代幣,並希望用 DAI 支付。
我閱讀了一些相關的問題,但沒有找到任何正確的答案。
由於 dai 是 ERC20 代幣,我如何接受任何代幣而不是乙太幣作為支付方式?
function () external payable {}
這只接受乙太,對吧?
提前抱歉我的英語和對solidity的了解很少
以下是如何實現此目的的範例:
IERC20 public daiInstance; uint256 public totalSupply; mapping(address => uint256) public balances; constructor(IERC20 _daiInstance) public { daiInstance = _daiInstance; } function buyXXX(uint256 daiAmount) external { uint256 xxxAmount = toXXX(daiAmount); bool success = daiInstance.transferFrom(msg.sender, address(this), daiAmount); require(success, "buy failed"); totalSupply = totalSupply.add(xxxAmount); balances[msg.sender] = balances[msg.sender].add(xxxAmount); } function sellXXX(uint256 xxxAmount) external { uint256 daiAmount = toDAI(xxxAmount); totalSupply = totalSupply.sub(xxxAmount); balances[msg.sender] = balances[msg.sender].sub(xxxAmount); bool success = daiInstance.transfer(msg.sender, daiAmount); require(success, "sell failed"); } function toXXX(uint256 daiAmount) internal view returns (uint256) { // do some logic here } function toDAI(uint256 xxxAmount) internal view returns (uint256) { // do some logic here }
在呼叫你的
buyXXX
函式之前,你的使用者需要呼叫approve
DAI 合約上的函式,將你的合約地址作為保管人(即被批准的那個)傳遞給它。當然,由於您使用
address(this)
作為將使用者的 DAI 代幣轉移到的目的地,這些代幣將被轉移到您的合約中。而且由於您沒有私鑰,因此您需要實現一個內部機制(函式),它允許您提取這些令牌。或者,address(this)
您可以在合約中添加一個類型的狀態變數,而不是 ,您可以在合約中的address
某個位置(例如,在建構子中)預先配置它。