Solidity

如何通過介面批准令牌?

  • May 12, 2021

我的合約中有一個與 Dai 的介面,並希望允許使用者批准合約以轉移他們的 Dai。Dai 使用 DSToken 程式碼,該程式碼具有依賴於 msg.sender 的批准功能:

function approve(address guy, uint wad) public returns (bool) {
   _approvals[msg.sender][guy] = wad;

   Approval(msg.sender, guy, wad);

   return true;
}

我有一個我的合約繼承的介面,它呼叫介面合約,如

contract DaiInterface {

   function approve(address guy, uint wad) public returns (bool);
}



contract DaiTransferrer is Ownable {

   DaiInterface daiContract;

   function approveDai(address guy, uint wad) public {
       daiContract.approve(guy, wad);
   }
}

所以問題是 msg.sender 在它到達代幣合約時會發生變化,所以我認為介面程式碼得到批准,而不是需要轉移 Dai 的主合約。解決這個問題的最佳方法是什麼?

不可能。

我想你誤解了這個approve方法。契約在任何情況下都不能批准自己花費他人的資金。

您需要在前端對其進行協調,以便使用者以精心設計的方式發送兩個交易。

  1. 使用者 => DAI(代幣合約),批准目標合約(你的)提款。
  2. User => contract, transferFrom DAI (token contract), 行使第一步授予的權限。

希望能幫助到你。

我認為您嘗試做的事情是不可能的。

想像一下,您可以創建一個函式來批准另一個地址使用一定數量的代幣。如果我做了一個惡意合約,讓你呼叫那個函式,我可以通過這種方式竊取你所有的代幣。

與傳遞函式相同。

這就是為什麼這些函式使用msg.sender,正是為了確保只有應該能夠呼叫該函式的確切人(在特定的使用者上下文中)以明確的方式這樣做。

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