Solidity

改進 ERC20 傳輸

  • October 27, 2021

我想接受穩定幣轉賬,目前有獨立的操作來處理付款,但我擔心這會導致錯誤的互動、資金損失和不正確的執行:

   function depositDAI() external payable {
       require(msg.value >= amount, "Insufficient funds");
       transferFunds(DAI, 10**18);
   }

   function depositUSDC() external payable {
       require(msg.value >= amount, "Insufficient funds");
       transferFunds(USDC, 10**6);
   }
   
   function depositUSDT() external payable {
       require(msg.value >= amount, "Insufficient funds");
       transferFunds(USDT, 10**6);
   }

是否可以在單個函式中處理這些操作?我想檢查:

  1. 支持 ERC20
  2. amountERC20 就足夠了
  3. 可與錢包直接互動

因此,讓我們從那裡開始,如果您不想接收 ETH,您的功能不必是payable.

對於第 1) 點和第 2) 點,此程式碼將有所幫助:

interface ERC20 {
   function transferFrom(address sender, address recipient, uint256 amount) public returns (bool);
}

contract Name {
   mapping(address -> bool) supportedStableCoins;
   mapping(address -> uint) minAmauntForSuportedStableCoin;

   function addCoin(address _coinAddress, uint _minAmount) external {
       require(supportedStableCoins[_coinAddress] == true, "Already added");
       supportedStableCoins[_coinAddress] = true;
       minAmauntForSuportedStableCoin[_coinAddress] = _minAmount;
   }

   function deposit(address _coinAddress, uint _amount) external {
      require(supportedStableCoins[_coinAddress] == true)
      require(minAmauntForSuportedStableCoin[_coinAddress] <= _amount);
      require(ERC20(_coinAddress).transferFrom(msg.sender, address(this), _amount));
}

注意 1:為了執行transferFrom消息發送者首先必須有approved合約_amount

注意 2:您必須constructor對函式具有和一些修飾符addCoin。你不希望每個人都在你的合約中添加硬幣。

關於第 3 點),如果您提供前端功能來進行交易,那麼一切都將是開箱即用的。

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