我用solid创建了一个彩票应用程序。所有的事情都工作得很好,但我想添加这个功能,当获胜者被选中时,它应该返回给我获胜者的地址。
我能做些什么?任何帮助将不胜感激,谢谢。这是我的代码。
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract Lottery_Application {
address public manager;
address payable[] public participants;
constructor() {
manager=msg.sender;
}
receive() external payable {
require(msg.value>=1 ether);
participants.push(payable(msg.sender));
}
function getbalance() public view returns(uint) {
require(msg.sender==manager);
return address(this).balance;
}
function random() public view returns(uint) {
return uint(keccak256(abi.encodePacked(block.difficulty,block.timestamp,participants.length)));
}
function selectwinner() public returns(address) {
require(msg.sender==manager);
require(participants.length>=3);
uint r=random();
address payable winner;
uint index=r% participants.length;
winner=participants[index];
winner.transfer(getbalance());
winner=address(msg.sender);
return winner;
}
}
状态更改函数无法返回任何内容。有两种方法。
- 创建和使用事件。
event WinnerSelected(address winner)
在winnerSelect函数的末尾,emit WinnerSelected(winner)
.
- 创建一个全局变量来存储最近的获胜者。
address public recentWinner
在winnerSelect函数结束时,recentWinner = winner
.
您可以声明一个公共变量,并在该变量中传递获胜者数组。查看下面的代码,注意被注释的行。
例如。
SPDX-License-Identifier: MIT pragma solidity ^0.8.9;
contract lotteryProject
{
address public owner;
address public addressofwinner; //public variable to store the address of winner
address payable [] public part;
receive() external payable virtual {}
uint value;
constructor()
{
owner=msg.sender;
}
function depositEthers() public payable{
require( msg.value==10 ether , " 2Ethers are required to participate in this lottery: ");
// participants[msg.sender]= value;
part.push(payable(msg.sender));
}
function totalDeposits()public view returns(uint)
{
require (msg.sender== owner, "Only owner is
authorized to chech the total deposits");
return address(this).balance;
}
//ethers deposition has been completed
//now ethers randomization is reamang
function random()public view returns (uint)
{
require(msg.sender==owner);
return uint(keccak256(abi.encodePacked(block.prevrandao,
block.timestamp , part.length)));
}
function winner()public
{
require(msg.sender==owner);
require(part.length>=3);
uint r = random();
uint index = r % part.length;
address payable won ;
won= part[index];
addressofwinner=won; //passing winner's address in the public variable
won.transfer(totalDeposits());
part= new address payable[](0); //TO empty the array after assigning a winner
}
}