Remix
Remix 說我在嘗試執行它時在我的測試契約中得到了未聲明的變數,當它在原始契約中聲明時。怎麼修?
基本上我需要從原始合約中的函式中獲取雜湊值,為此函式 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. 我建議您在定義使用它的映射之前定義結構。這是這裡缺少程式碼的一部分嗎?