<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Solidity開發ERC20智能合約claim token的功能

      // SPDX-License-Identifier: MIT
      pragma solidity ^0.8.20;
      
      import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
      import "@openzeppelin/contracts/access/Ownable.sol";
      
      contract VSampleToken is ERC20, Ownable {
          // 規則參數(使用更節省gas的數據類型)
          uint256 public constant DAILY_CLAIM_AMOUNT = 100 * 10**18;
          uint8 public constant DAILY_CLAIM_LIMIT = 2;
          uint256 public constant TOTAL_CLAIM_LIMIT = 1000 * 10**18;
          uint256 public constant MIN_RESERVE = 100000 * 10**18;
          uint256 public constant MAX_SUPPLY = 1000000 * 10**18;
          
          struct ClaimRecord {
              uint32 lastClaimDay;  
              uint8 dailyClaimCount;
              uint96 totalClaimed; 
          }
          
          mapping(address => ClaimRecord) public claimRecords;
          // 事件:成功領取
          event Claimed(address indexed user, uint256 amount);
      
          constructor() ERC20("VSampleToken", "VST") Ownable(msg.sender) {
              _mint(address(this), MAX_SUPPLY);
          }
      
          // 統一余額檢查邏輯
          function _checkReserve() private view {
              require(
                  balanceOf(address(this)) >= DAILY_CLAIM_AMOUNT + MIN_RESERVE,
                  "Insufficient contract reserve"
              );
          }
          
          function claim() external {
              address user = msg.sender;
              _checkReserve(); 
      
              if (user == owner()) {
                  _transfer(address(this), user, DAILY_CLAIM_AMOUNT);
                  return;
              }
      
              ClaimRecord storage record = claimRecords[user];
              uint32 currentDay = uint32(block.timestamp / 1 days);
              
              // 新的一天重置計數器
              if (record.lastClaimDay != currentDay) {
                  record.lastClaimDay = currentDay;
                  record.dailyClaimCount = 0;
              }
              
              require(record.dailyClaimCount < DAILY_CLAIM_LIMIT, "Daily limit reached");
              require(
                  record.totalClaimed + DAILY_CLAIM_AMOUNT <= TOTAL_CLAIM_LIMIT, 
                  "Total claim limit exceeded"
              );
      
              // 更新記錄(使用安全類型轉換)
              record.dailyClaimCount += 1;
              record.totalClaimed += uint96(DAILY_CLAIM_AMOUNT);
              
              _transfer(address(this), user, DAILY_CLAIM_AMOUNT);
              emit Claimed(user, DAILY_CLAIM_AMOUNT);
          }
          
          function withdrawRemaining(address to, uint256 amount) external onlyOwner {
              require(
                  balanceOf(address(this)) - amount >= MIN_RESERVE,
                  "Cannot break reserve requirement"
              );
              _transfer(address(this), to, amount);
          }
      
          function getClaimStatus(address user) external view returns (
              bool canClaim,
              uint8 availableToday,
              uint256 remainingTotal
          ) {
              if (user == owner()) {
                  return (
                      balanceOf(address(this)) >= DAILY_CLAIM_AMOUNT + MIN_RESERVE,
                      type(uint8).max,
                      type(uint256).max
                  );
              }
      
              ClaimRecord memory record = claimRecords[user];
              uint32 currentDay = uint32(block.timestamp / 1 days);
              
              availableToday = record.lastClaimDay == currentDay 
                  ? DAILY_CLAIM_LIMIT - record.dailyClaimCount
                  : DAILY_CLAIM_LIMIT;
                  
              remainingTotal = TOTAL_CLAIM_LIMIT - record.totalClaimed;
              canClaim = (availableToday > 0) && 
                        (remainingTotal >= DAILY_CLAIM_AMOUNT) &&
                        (balanceOf(address(this)) >= DAILY_CLAIM_AMOUNT + MIN_RESERVE);
          }
      }

       

      posted @ 2025-08-06 14:40  daviyoung  閱讀(18)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲乱码日产精品bd在线| 亚洲日本欧洲二区精品| 18禁裸乳无遮挡自慰免费动漫 | 巢湖市| 国产成人综合色在线观看网站| 亚洲中文字幕国产精品| 青阳县| 亚洲自拍偷拍一区二区三区| 蜜臀av黑人亚洲精品| 老色鬼永久精品网站| jizzjizz少妇亚洲水多| 高清| 亚洲第一二三区日韩国产| 无码内射中文字幕岛国片| 中文字幕国产日韩精品| 国产AV无码专区亚洲AV紧身裤| 免费看成人欧美片爱潮app| 国产高清在线精品一区二区三区| 久久91精品牛牛| 亚洲无人区码二码三码区| 中文字幕久久六月色综合| 国产一区二区日韩经典| 亚洲一区在线成人av| 午夜福利偷拍国语对白| 久久久精品国产精品久久| 999精品全免费观看视频| 国产av一区二区不卡| 动漫av纯肉无码av在线播放| 丝袜美腿亚洲综合在线观看视频| 免费无码观看的AV在线播放| 亚洲无码在线免费观看| 国产成人8X人网站视频| 云安县| 青青草无码免费一二三区| 亚洲国产午夜精品理论片| 国产不卡在线一区二区| 四虎成人精品国产永久免费| 欧美性受xxxx白人性爽| 青青青青久久精品国产| 国产高潮刺激叫喊视频| 国产精品疯狂输出jk草莓视频|