Solidity
在安全帽測試中更改事務 msg.value 和 msg.sender
我有一個彩票類型的應用程序,使用者通過該應用程序向當時支付獎勵的契約匯款。簡化後,我嘗試測試的方法是這樣的:
struct Bet { address payable user; bytes32 gameId; uint amount; uint num; } function placeBet(bytes32 _gameId, uint _num) public payable { ... // add the new bet Bet[] storage bets = gameBets[_gameId]; bets.push(Bet(msg.sender, _gameId, msg.value, _num)); // add the mapping bytes32[] storage userBets = userToBets[msg.sender]; userBets.push(_gameId); ... }
為了正確測試這一點,我需要手動設置我正在觸發的交易的發送者和價值,在這種情況下
placeBet()
。我嘗試在方法的參數(如 )之後添加帶有
from
和value
鍵的散列{ from: addr, value: 5 }
,我知道這適用於松露:before(async function () { LoteryApp = await ethers.getContractFactory("LoteryApp"); [owner, addr1, addr2] = await ethers.getSigners(); contract = await LoteryApp.deploy(); }); describe("it takes bets", function() { it("and assigns them properly", async function() { // user places Bet on 2 await contract.placeBet(game.id, 2, { from: addr1, value: 5000 }); // user places Bet on 1 await contract.placeBet(game.id, 2, { from: addr2, value: 3000 }); ... }) })
我還嘗試了
connect
取自安全帽文件的方法:describe("it takes bets", function() { it("and assigns them properly", async function() { // user places Bet on 2 await contract.connect(addr1).placeBet(game.id, 2); // admin places Bet on 1 await contract.connect(addr2).placeBet(game.id, 1); ... }); })
但這些選項都不起作用。交易似乎總是從同一個地址發送,值為 0。
我正在使用solidity 0.7.3,安全帽2.3.3,ethers 5.4
您輸入的值似乎太小了。我認為這就是交易價值為 0 的原因。
await contract.placeBet(game.id, 2, { value: ethers.utils.parseEther("0.5") }); // msg.value = 0.5 eth
要從另一個帳戶呼叫該函式,請嘗試:
await contract.connect(addr1).placeBet(game.id, 2, { value: ethers.utils.parseEther("0.5") });
我不確定為什麼您的第一個範例不起作用。但是使用該
connect
方法,您應該能夠以與嘗試使用標準乙太格式相同的方式將選項傳遞給交易。這裡的例子:it(`should deposit 50 eth to weth contract:`, async () => { weth .connect(accounts[1]) .deposit({ value: ethers.utils.parseEther("50") }); });
注意:存款函式不帶任何參數。