Remix

Remix 說我在嘗試執行它時在我的測試契約中得到了未聲明的變數,當它在原始契約中聲明時。怎麼修?

  • June 29, 2021

基本上我需要從原始合約中的函式中獲取雜湊值,為此函式 makeBet() 需要一些輸入。該函式如下所示:

pragma solidity >=0.8.0 <0.9.0;

contract Bet {

   address creator;

   // Bet status
   enum BetStatus { LONG, SHORT, LONG_NGMI, SHORT_NGMI }
   event Received(address, uint);

   // Game structure
   struct Game {
       uint256 betAmount;
       string coin;
       uint256 guess;
       BetStatus status;
       address maker;
       address taker;
       string expiry;
   }

   constructor() public payable {
       creator = msg.sender;
   }

    event GameCreated (
       uint newGameIndex,
       uint amountBetted,
       uint guess,
       address by
   );

   mapping (uint256 => Game) public activeGames;

    receive() external payable {
     emit Received(msg.sender, msg.value);
   }

   event BetMade (bytes32);

   function makeBet(string memory coin, uint guess, string memory expiry, uint betStatus) public payable {

     Game memory newGame = Game(msg.value, coin, guess, BetStatus(0), msg.sender, address(0), expiry);

     newGame.status = BetStatus(betStatus);

     bytes32 hash = keccak256(abi.encodePacked(msg.sender, msg.value, block.timestamp, coin, guess, expiry, newGame.status));

     activeGames[uint256(hash)] = newGame;

     emit BetMade(hash);
   }

由於原始合約已經完成,並且是我第一個完成的智能合約,我還想在部署之前做一些適當的測試。這是我的 Bet_test.sol 合約:

contract TestBet {
   
 Bet bet;

 function beforeAll() public {
   bet = new Bet();
 }
/// #value: 100
   function getHash() public returns (bytes32) {
       bet.makeBet("ETH", 5000, "tomorrow", 0);
       return hash;
   }
}

但是,當我嘗試對其進行測試時,這會返回一個錯誤,說“未找到或不可見成員“硬幣”。這可能是因為它是原始函式中的局部變數。我如何訪問它?作為初學者,我有點迷茫。

在原始合約中,函式的第一個參數是字元串類型。但是在您的測試中,您的 Sending ETH as 參數本身不是字元串,您可以用 "" 將值括起來以使其成為字元串或創建一個變數,例如:

string ETH="ETH";
bet.makeBet(ETH, 5000, tomorrow, 0);

或 bet.makeBet(“ETH”,5000,tomorrow,0); 不要忘記對第三個參數也使用相同的方法,因為這與第一個參數有相同的問題。

看起來你沒有定義 Game. 我建議您在定義使用它的映射之前定義結構。這是這裡缺少程式碼的一部分嗎?

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