Solidity

函式()公共支付修飾符可以在發送令牌時觸發動作還是僅在發送乙太時有效?

  • February 3, 2022

當地址向合約發送乙太幣時,payable 修飾符會觸發一個動作。

例如:

function () public payable {
     require(msg.data.length == 0);
     DoSomething();
   }

msg.sender 發送令牌時是否也會觸發此操作?我的問題是,當地址也發送令牌時,是否可以通過 payable 觸發操作,或者是否需要另一個修飾符或更複雜的解決方法來實現這一點?

為了能夠處理接收令牌,您可以讓您的類從ERC223Receiver標準繼承:

contract ERC223Receiver
{
   function tokenFallback(address _from, uint _value, bytes _data);
}

contract YourContract is ERC223Receiver
{
   function tokenFallback(address _from, uint _value, bytes _data)
   {
       // Handle receiving tokens
   }
}

我自己沒有測試過這個。

來源:https ://github.com/ethereum/EIPs/issues/744

修飾符payable允許函式接收乙太幣。您範例中的函式是一個預設的應付備份函式,每次有人向您的合約發送乙太幣時都會呼叫該函式。

您還可以實現任何其他支付功能,以便該功能可以接受 Ether。

Payable 只允許函式接受乙太幣,它與代幣轉移沒有任何關係。

發送代幣只是 ERC20 標準中的一個傳輸函式。預設情況下,它只會更改令牌內的餘額。因此,如果您將 1 個令牌從 A 發送到 B,則唯一的變化將是:

token.balances[A] = token.balannces[A] - 1
token.balances[B] = token.balances[B] + 1

為了能夠做你想做的事,你有兩個選擇。

  1. 實現您的令牌,以便在呼叫 transfer 時呼叫 tokenFallback 函式。請記住,發送代幣必須在接收合約中呼叫 tokenFallback 函式。預設 Open Zeppelin ERC20 令牌不會這樣做。您將不得不對其進行修改。
  2. 使用 web3 庫編寫一個 javascript 或 python 程式碼,它將監聽來自你的令牌的傳輸事件,並在實現傳輸時呼叫接收合約中的一些函式。

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