Solidity
無法讓 deposit() 在簡單的 wETH 合約中工作
我正在嘗試在 Remix 中測試WETH9合約的
deposit()
功能。我編譯並部署了一個簡化的 WETH9 合約://SPDX-License-Identifier: UNLICENSED pragma solidity ^0.7.1; contract WETH9 { event Deposit(address indexed dst, uint wad); mapping (address => uint) public balanceOf; //get balance of WETH held by an address? function deposit() public payable { balanceOf[msg.sender] += msg.value; emit Deposit(msg.sender, msg.value); } function totalSupply() public view returns (uint) { return address(this).balance; } }
然後我通過傳入 WETH9 合約地址編譯並部署了下面的呼叫者合約。
//SPDX-License-Identifier: UNLICENSED pragma solidity ^0.7.1; import "./WETH9.sol"; interface IWETH9 { function deposit() external payable; } contract Caller { IWETH9 public weth9; constructor(IWETH9 _weth9){ weth9 = _weth9; } function call_deposit() public payable { weth9.deposit{ value: 50 }(); } }
然後我呼叫了這個
call_deposit()
函式。這將恢復weth9.deposit{ value: 50 }();
並導致以下錯誤。我不確定問題是什麼。也許我沒有發送正確的價值?vm 賬戶中有 99.9+ ETH。$$ vm $$從:0x5B3…eddC4 到:Caller.call_deposit() 0xE5f…78e22 值:0 wei 數據:0x374…22832 日誌:0 雜湊:0x66d…ea411 向 Caller.call_deposit 交易錯誤:VM 錯誤:恢復。 revert 事務已恢復到初始狀態。注意:如果您發送值並且您發送的值應該小於您目前的餘額,則呼叫的函式應該是應付的。調試事務以獲取更多資訊。
IWETH9 _weth9
您應該將新創建的地址的地址傳遞給建構子參數,而不是傳遞WEHT9
給建構子,並在其中創建新的 IWETH:constructor(address weth9Address){ weth9 = IWETH9(weth9Address); }
此外,
Caller
合約應該有乙太幣,因為weth9.deposit{ value: 50 }();
使用合約本身的乙太幣。