IERC20.approve(spender, amount) 認為所有者也是合約
我擁有這些功能並將我的契約部署到 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))