Solidity

如何創建一個只接受客戶令牌的 Payable 函式?

  • March 5, 2021

我有一個我似乎找不到答案的問題,希望社區可以提供幫助(這是我在這裡的第一篇文章,所以如果首先提出的問題是錯誤的,我深表歉意)。

我正在嘗試創建一個帶有 Payable 功能的契約,該功能只接受特定的代幣,而不是 ETH,作為付款。我擁有代幣合約和專門為接受該特定代幣付款而創建的合約。

這甚至可能嗎?我發現這是一個可能的解決方案:

資料來源:如何創建只接受特定 erc20 代幣的眾籌?

contract Crowdsale {

       address owner;  
       mapping(address => uint256) balances;
       function Crowdsale(){
           owner = msg.sender;
       }

       function acceptOnlyMyToken(address _yourTokenAddress, uint256 amount){
           address user = msg.sender;
           YourToken token = YourToken(_yourTokenAddress);

           //get the user's balance
           uint256 userBalance = token.balanceOf(user);
           //check user's balance
           if(userBalance >= amount){      
               token.transferFrom(user, owner, amount);        

           }

       }

   }

使用上面的程式碼假設以下內容是否安全?

  1. 替換YourToken token = YourToken(_yourTokenAddress);YourToken token = YourToken(address(0xABCD...));“0xABCD”作為我在單獨契約中的代幣的地址應該可以工作。
  2. require(msg.value == 100在功能下指定acceptOnlyMyToken(...)將允許我設置所需的具體付款金額。

另外,我沒有看到這個函式被稱為“payable”,這有關係嗎?原因是因為我想將變數作為函式的一部分傳遞,以將 XYZ 工作作為合約邏輯的一部分,為此我收到了特定數量的該令牌的付款。

有什麼想法嗎?

您不payable用於非協議類型的傳輸。ERC20 不是“協議”,因為它是在契約中定義的。

無法檢測到盲目轉移到合約的 ERC20 代幣。充其量,合約可以檢查它的餘額,但它不知道是誰寄了錢,所以這不好。

uint myTokenBalance = IERC20(<tokenAddress>).balanceOf(address(this));

您正在尋找“approve and transferFrom”模式。它是這樣的:

  1. 使用者授權你的合約使用者的代幣餘額中提取。
  2. 然後,使用者呼叫你的合約中的一個函式來嘗試提取代幣。

第 2 步如下所示:

function sendMe100() external {
 IERC20(<tokenAddress>).transferFrom(msg.sender, address(this), 100);
 // success
}

上述假設使用者已通過首先呼叫approveERC20 合約中的函式(步驟 1)授權轉移,但這通常是前端問題,與您的合約無關。

希望能幫助到你。

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