【发布时间】:2022-01-23 00:41:03
【问题描述】:
我正在尝试为累积奖金游戏编写一个智能合约,它计算用户的费率并随机选择一个用户,但我得到 “如果您发送价值,则调用的函数应该是支付的,并且您发送的价值应该更少比您当前的余额。” 尝试执行sendToWinner() 函数时出错。
注意:请不要介意逻辑错误我知道这是为了训练我的 Solidity 写作技巧的逻辑错误。
// SPDX-License-Identifier: MIT
pragma solidity >=0.7.0 <0.9.0;
contract Jackpot {
uint256 public pot;
mapping (address => uint256) public balances;
address[] public participators;
address public minter;
constructor(){
minter = msg.sender;
}
function addToPot() public payable {
balances[msg.sender] += msg.value;
pot += msg.value;
participators.push(msg.sender);
}
modifier onlyOwner {
require(msg.sender == minter);
_;
}
function random() public view returns(uint){
return uint(keccak256(abi.encodePacked(block.difficulty, block.timestamp)))%100;
}
function sendToWinner() payable public onlyOwner {
uint8[100] memory participatorsRates;
uint8 rate;
uint8 participatorsRatesIndex=0;
for(uint8 participatorIndex = 0; participatorIndex<participators.length; participatorIndex++){
rate = uint8(balances[participators[participatorIndex]]*100/pot);
for(; participatorIndex<rate ; participatorsRatesIndex++){
participatorsRates[participatorsRatesIndex] = participatorIndex;
}
balances[participators[participatorIndex]]=0;
}
uint8 winningParticipatorIndex = participatorsRates[random()];
payable(participators[winningParticipatorIndex]).transfer(pot);
}
}
【问题讨论】:
标签: blockchain solidity smartcontracts