Solidity

接受 Dai 或任何 ERC20 代幣作為付款

  • July 30, 2021

我創建了一個 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函式之前,你的使用者需要呼叫approveDAI 合約上的函式,將你的合約地址作為保管人(即被批准的那個)傳遞給它。

當然,由於您使用address(this)作為將使用者的 DAI 代幣轉移到的目的地,這些代幣將被轉移到您的合約中。而且由於您沒有私鑰,因此您需要實現一個內部機制(函式),它允許您提取這些令牌。或者,address(this)您可以在合約中添加一個類型的狀態變數,而不是 ,您可以在合約中的address某個位置(例如,在建構子中)預先配置它。

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