智能合約怎么進(jìn)行打賞功能把介?在互聯(lián)網(wǎng)和開(kāi)源平臺(tái)上分享經(jīng)驗(yàn)或者代碼后勤讽,網(wǎng)站通常有一個(gè)打賞功能,用于對(duì)閱讀者對(duì)分享者的感謝拗踢,使用solidity編寫(xiě)一個(gè)智能合約打賞功能:
1.任何人可以像合約賬號(hào)打賞捐贈(zèng)
2.任何人可以查看歷史捐贈(zèng)總額
3.合約擁有者可以設(shè)置余額提醒金額
4.合約擁有者可以進(jìn)行提現(xiàn)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Donator {
// 事件脚牍,用于記錄打賞行為
event Donated(address indexed donator, uint256 amount);
// 事件,用于記錄提現(xiàn)行為
event Withdrawn(address indexed withdrawer, uint256 amount);
// 事件巢墅,用于記錄提醒金額設(shè)置
event AlertAmountSet(uint256 alertAmount);
// 事件诸狭,用于觸發(fā)余額超過(guò)提醒金額的提醒
event AlertTriggered(uint256 balance);
// 合約擁有者地址
address private owner;
// 提醒金額
uint256 private alertAmount;
// 捐贈(zèng)總額
uint256 private totalDonations;
// 構(gòu)造函數(shù),設(shè)置合約的擁有者
constructor() {
owner = msg.sender;
}
// 打賞函數(shù)君纫,任何人都可以調(diào)用作谚,向合約發(fā)送ETH
function donate() public payable {
require(msg.value > 0, "Donation amount must be greater than 0");
totalDonations += msg.value;
emit Donated(msg.sender, msg.value);
_checkAlert();
}
// 設(shè)置提醒金額,只有合約的擁有者可以調(diào)用
function setAlertAmount(uint256 _alertAmount) public {
require(msg.sender == owner, "Only the owner can set alert amount");
require(_alertAmount > 0, "Alert amount must be greater than 0");
alertAmount = _alertAmount;
emit AlertAmountSet(alertAmount);
}
// 提現(xiàn)函數(shù)庵芭,只有合約的擁有者可以調(diào)用
function withdraw() public {
require(msg.sender == owner, "Only the owner can withdraw");
uint256 amount = address(this).balance;
emit Withdrawn(msg.sender, amount);
payable(msg.sender).transfer(amount);
}
// 獲取所有捐贈(zèng)總數(shù)的函數(shù)
function getTotalDonations() public view returns (uint256) {
return totalDonations;
}
// 獲取合約余額的函數(shù)妹懒,只有合約的擁有者可以調(diào)用
function getBalance() public view returns (uint256) {
require(msg.sender == owner, "Only the owner can view the balance");
return address(this).balance;
}
// 檢查是否達(dá)到提醒金額,如果達(dá)到則觸發(fā)提醒事件
function _checkAlert() private {
if (address(this).balance >= alertAmount) {
emit AlertTriggered(address(this).balance);
}
}
}