上文第2部分,合约更换为如下代码,可实现功能
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract MONRefund {
event RefundSuccess(
address indexed sender,
uint256 amount,
uint256 timestamp
);
/**
* 接收 MON 原生代币的函数
* 当用户向合约发送 MON 时,会自动触发此函数
* 合约会立即将 MON 原路返还给发送者
*/
receive() external payable {
require(msg.value > 0, "Amount must be greater than 0");
// 使用 call 进行原生代币转账
(bool success, ) = msg.sender.call{value: msg.value}("");
require(success, "Refund failed");
emit RefundSuccess(msg.sender, msg.value, block.timestamp);
}
/**
* 查看合约中的 MON 余额
* 通常余额应为 0,因为 MON 会立即返还
*/
function getMONBalance() public view returns (uint256) {
return address(this).balance;
}
/**
* 仅合约所有者可以提取意外发送的 MON
*/
function withdrawMON(address payable recipient) external {
require(msg.sender == owner, "Only owner can withdraw");
uint256 balance = address(this).balance;
require(balance > 0, "No MON to withdraw");
(bool success, ) = recipient.call{value: balance}("");
require(success, "Withdrawal failed");
}
// 合约所有者地址
address public owner;
// 构造函数,设置合约所有者
constructor() {
owner = msg.sender;
}
}
