Solidity
如何通過介面批准令牌?
我的合約中有一個與 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
方法。契約在任何情況下都不能批准自己花費他人的資金。您需要在前端對其進行協調,以便使用者以精心設計的方式發送兩個交易。
- 使用者 => DAI(代幣合約),批准目標合約(你的)提款。
- User => contract, transferFrom DAI (token contract), 行使第一步授予的權限。
希望能幫助到你。
我認為您嘗試做的事情是不可能的。
想像一下,您可以創建一個函式來批准另一個地址使用一定數量的代幣。如果我做了一個惡意合約,讓你呼叫那個函式,我可以通過這種方式竊取你所有的代幣。
與傳遞函式相同。
這就是為什麼這些函式使用
msg.sender
,正是為了確保只有應該能夠呼叫該函式的確切人(在特定的使用者上下文中)以明確的方式這樣做。