Solidity

無法讓 deposit() 在簡單的 wETH 合約中工作

  • July 17, 2022

我正在嘗試在 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 }();使用合約本身的乙太幣。

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