Solidity

IERC20.approve(spender, amount) 認為所有者也是合約

  • December 18, 2020

我擁有這些功能並將我的契約部署到 Ropsten 測試網。

 function setSmartContractAllownace(uint daiAmountIn) public {
    IERC20 daiToken = IERC20(ropstenDAI);
    daiToken.approve(address(this), daiAmountIn);
 }

 function getContractAddress() public view returns (address) {
     return address(this);
 }
 
 function getOwner() public view returns (address) {
     return msg.sender;
 }

當我呼叫getContractAddress()andgetOwner()時,它們分別返回正確的值。

但是,當我呼叫時setSmartContractAllownace(1000),它成功批准了,但是呼叫者(所有者)設置為智能合約的地址

我通過進入 DAI 並檢查津貼來驗證這一點。

這是當我將我的帳戶與 DAI_owner和智能合約作為_spender

在此處輸入圖像描述

如您所見,這將返回 0。

但如果我_owner也把它作為智能合約,

在此處輸入圖像描述

它顯示了正確的津貼。

到底是怎麼回事?

謝謝你。

如果您檢查IERC20.approve()函式的簽名,您可以看到,第一個參數是您允許使用 DAI 的地址。

你使用daiToken.approve(address(this), daiAmountIn)了這意味著你允許你的合約花費你合約的 DAI。這沒有多大意義。

如果您只是想從自己的資金中為您的合約添加一些代幣,您可以使用您的錢包將其轉移到您的合約地址。在這種情況下,只需向合約地址發送一些 DAI。

如果你想使用呼叫者的 DAI 代幣,那麼你必須先允許它。但是合約當然不能讓自己花掉別人的錢。你可以去 etherscan 找到 DAI 代幣的合約,並approve()用你的合約地址呼叫這裡。之後,您將能夠transferFrom()成功地從您的契約中呼叫至允許的金額。

**警告:**永遠不要在生產中使用 DELEGATECALL。如果您不知道如何使用它是非常危險的。

如果您希望目標合約知道呼叫者是您,則需要使用委託呼叫。

DelegateCall,顧名思義,是呼叫者合約呼叫目標合約函式的呼叫機制,但是當目標合約執行其邏輯時,上下文不在執行呼叫者合約的使用者身上,而是在呼叫者合約上

在你的情況下,它應該是這樣的: address(ropsten).delegatecall(abi.encodeWithSignature("approve(address,uint256)", address(this), value))

進一步閱讀:https ://medium.com/coinmonks/delegatecall-calling-another-contract-function-in-solidity-b579f804178c

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