乐于分享
好东西不私藏

源码级解剖:LAX主代币合约到底安不安全?一份完整审计报告告诉你

源码级解剖:LAX主代币合约到底安不安全?一份完整审计报告告诉你

LAXToken 主代币合约,到底安不安全?

今天,我们不再停留在表面猜测,也不再依赖第三方工具的“一键检测”。

直接上硬核的——扒开 LAXToken 的智能合约源代码,逐行审计。

从 ERC20 标准实现,到权限控制机制;从转账逻辑,到所谓的“黑白名单”真相。一份完整的 LAXToken 智能合约安全审计报告,今天全部摊开给你看。

代码不会说谎,真相就在这里。

01 LAXToken 智能合约安全审计报告

项目概述

合约名称: LAXToken

代币符号: LAX

总供应量: 1,310,000 LAX

区块链: BNB Chain (BSC)

【检查点1】是否开源?

✅ 结论:

【检查点2】是否为代理合约?

✅ 结论:不是代理合约

相关源代码

solidity

// 无 delegatecall// 无 implementation 变量// 无 upgrade 函数

contractLAXTokenis ExcludedFromFeeList, FirstLaunch, BaseUSDTWA, ERC20 {

// 标准继承结构,无代理模式特征

constructor(address staking_,address project_)

Owned(msg.sender)

ERC20(“LAX”,“LAX”,18,1310000 ether)

{// 直接在构造函数中初始化,无升级逻辑}}

说明合约无delegatecall 调用

无存储implementation 地址的变量

无可升级函数(如upgradeTo

合约逻辑固定,不可升级

【检查点3】管理员权限

结论:管理员权限较大,但是已抛弃

相关源代码

1. Owner 定义(继承自 Owned)

solidity

import{Owned}from“solmate/src/auth/Owned.sol”;contractLAXTokenis Owned {// Owned 合约提供了 onlyOwner 修饰符// owner 地址在构造函数中设置为 msg.sender}

2. Owner 拥有的管理函数

solidity

// 修改兑换阈值functionsetSwapAtAmount(uint256 newValue)external onlyOwner {    swapAtAmount = newValue;}

// 修改兑换比例(上限100%)functionsetNumTokensSellRate(uint256 newValue)external onlyOwner {require(newValue <=100,“invalid rate”);    numTokensSellRate = newValue;}

// 修改项目合约地址functionsetProject(address addr)external onlyOwner {require(addr !=address(0),“zero address”);    PROJECT = addr;}

// 修改 LAXO 代币地址functionsetLAXO(address addr)external onlyOwner {require(addr !=address(0),“zero address”);    LAXO = addr;}

// 开启交易(一次性的关键操作)functionsetPresale()external onlyOwner {    presale =true;launch();deliveryReserveU();}

// 修改冷却时间functionsetColdTime(uint40 _coldTime)external onlyOwner {    coldTime = _coldTime;}

// 添加/移除免手续费地址functionexcludeFromFee(address account)public onlyOwner { _isExcludedFromFee[account]=true;}functionincludeInFee(address account)public onlyOwner {    _isExcludedFromFee[account]=false;}

3. ownermarketingAddress 的提款权限

solidity

// marketingAddress 从 PROJECT 合约动态获取

functionmarketingAddress()publicviewreturns(address){returnIProject(PROJECT).marketingAddress();}

// emergencyWithdraw 允许 owner 或 marketingAddress 调用

functionemergencyWithdraw(address _token,address _to,uint256 _amount)external{require(msg.sender == owner || msg.sender ==marketingAddress(),“!owner or marketing”);

require(_token !=address(this),“token is this”);

require(_to !=address(0),“to zero addr”);

IERC20(_token).transfer(_to, _amount);}


这个紧急存在一定限制

1!=address(this)2、调用的是transfer函数。因此只能转移本合约中非本代币的ERC20代币,包括本合约部署前的代币以及后期别人误会转的非LAX代币。底池、交互合约、其他用户持有的代币无法转移。

4. Owner 权限抛弃情况(已抛弃)

Owner权限已抛弃,不存在中心化风险

【检查点4】是否有致命功能?

1、修改代币总量

结论:无增发风险,总量固定

solidity

solidity

// 构造函数中一次性铸造,无 mint 函数constructor(address staking_, address project_)     ERC20(“LAX”, “LAX”, 18, 1310000 ether)  // 总量固定 1,310,000{    // 所有代币在部署时铸造给部署者}// ❌ 全合约无 mint() 函数// ❌ 无 increaseSupply() 函数// ✅ totalSupply 不可变

2、更换核心合约

✅ 结论:无代理模式,逻辑固定

olidity

// ❌ 无 delegatecall// ❌ 无 implementation 变量  // ❌ 无 upgradeTo 函数contract LAXToken is ExcludedFromFeeList, FirstLaunch, BaseUSDTWA, ERC20 {    // 标准继承,非代理模式    // 合约逻辑部署后不可更改}

3、冻结转账

✅ 结论:无冻结功能,所有地址可自由转账

solidity

// ❌ 无 blacklist 映射// ❌ 无 freeze 函数// ❌ 无 paused 变量function _transfer(address sender, address recipient, uint256 amount) internal {    // 转账逻辑中无任何冻结检查    // 所有地址均可正常转账    if (uniswapV2Pair == sender) {        require(presale, “pre”);  // 仅检查预售状态        _handleBuy(…);    } else if (uniswapV2Pair == recipient) {        require(presale, “pre”);        require(block.timestamp >= lastBuyTime[sender] + coldTime, “cold”);  // 仅冷却检查        _handleSell(…);    } else {        super._transfer(sender, recipient, amount);  // 普通转账无限制    }}

4. 冷却时间可被owner修改

solidity

solidity

uint40 public coldTime = 1 minutes;function setColdTime(uint40 _coldTime) external onlyOwner {    coldTime = _coldTime; 

 // 可设为 0 或极大值}

// 卖出时检查冷却require(block.timestamp >= lastBuyTime[sender] + coldTime, “cold”);

【检查点5】合约授权

✅ 结论:授权合理但存在无限授权风险

相关源代码

1. 授权合约自身给 Router(用于卖出 LAX)

solidity

constructor(address staking_,address project_){// 授权合约的 LAX 代币给 Router(无限额度)    allowance[address(this)][address(uniswapV2Router)]=type(uint256).max;}

2. 授权 USDT 给 Router(用于购买 LAXO)

olidity

constructor(address staking_,address project_){// 授权合约的 USDT 给 Router(无限额度)IERC20(USDT).approve(address(uniswapV2Router),type(uint256).max);}

3. 授权使用场景

solidity

// 卖出 LAX 换 USDT(使用 LAX 授权)function_swapTokenForUsdt(uint256 tokenAmount,address to)private{address[]memory path =newaddress[](2);    path[0]=address(this);

// LAX    path[1]=address(USDT);    uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens( tokenAmount,0, path, to, block.timestamp);}

// 用 USDT 买 LAXO(使用 USDT 授权)function_swapUsdtForLaxo(uint256 usdtAmount,address to)private{address[]memory path =newaddress[](2);

path[0]= USDT;

path[1]= LAXO;

uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens(   usdtAmount,0, path, to, block.timestamp    );});  // 普通转账无限制    }}

说明

授权给官方Router USDT 是标准操作

【检查点6】外部合约依赖

结论:存在高风险外部依赖

相关源代码

1. PROJECT 合约依赖(可被篡改)

solidity
addresspublic PROJECT;functionsetProject(address addr)external onlyOwner {    PROJECT = addr;

// owner 可随时修改}functiondividendAddress()publicviewreturns(address){returnIProject(PROJECT).dividendWallet();

// 外部调用}functionecosystemAddress()publicviewreturns(address){returnIProject(PROJECT).ecosystemAddress();// 外部调用}

functionmarketingAddress()publicviewreturns(address){returnIProject(PROJECT).marketingAddress();// 外部调用}


2. LAXO 合约依赖(可被篡改)

solidity

addresspublic LAXO;functionsetLAXO(address addr)external onlyOwner {    LAXO = addr;// owner 可随时修改}

function_isLaxoReachedMaxBurn()privateviewreturns(bool){if(LAXO ==address(0))returnfalse;returnILAXOToken(LAXO).isReachedMaxBurn();// 外部调用}

3. Uniswap V2 Pair 依赖

solidity

// 获取池子储备(uint112 reserveU,uint112 reserveThis,)=IUniswapV2Pair(uniswapV2Pair).getReserves();// 同步池子IUniswapV2Pair(uniswapV2Pair).sync();

说明

PROJECT 和 LAXO 地址可被 owner 任意修改Owner权限已抛弃,后续无法修改,Uniswap V2 Pair为合约运行中需要的外部合约。

【检查点7】核心功能检测

⚠️ 结论:存在复杂手续费和利润税机制

相关源代码

1. 免手续费名单机制

solidity

mapping(address=>bool)internal _isExcludedFromFee;function_transfer(…)internal virtual override {if(inSwapAndLiquify || _isExcludedFromFee[sender]|| _isExcludedFromFee[recipient]){  super._transfer(sender, recipient, amount);// 跳过所有限制return;}// 正常用户执行手续费逻辑}

2. 买入手续费(5%)

solidity

function_handleBuy(address sender,address recipient,uint256 amount)private{uint256 laxoFee =(amount *250)/10000;// 2.5%uint256 uFee =(amount *250)/10000;// 2.5%uint256 totalFee = laxoFee + uFee;if(totalFee >0){        super._transfer(sender,address(this), totalFee);if(_isLaxoReachedMaxBurn()){            AmountU += totalFee;}else{            AmountLaxo += laxoFee;            AmountU += uFee;}}}

3. 卖出手续费 + 利润税

solidity

function_handleSell(address sender,address recipient,uint256 amount)private{uint256 baseLaxoFee =(amount *250)/10000;// 2.5%uint256 baseUFee =(amount *250)/10000;// 2.5%// 利润税计算(uint256 profitU,uint256 profitLaxo,uint256 profitEcosystem)=_calcProfitTax(sender, amountUOut, reserveU, reserveThis);uint256 totalFee = baseLaxoFee + baseUFee + profitU + profitLaxo + profitEcosystem;bool laxoReachedMaxBurn =_isLaxoReachedMaxBurn();if(laxoReachedMaxBurn){  AmountU += baseLaxoFee + baseUFee + profitU;    AmountEcosystem += profitLaxo + profitEcosystem;}else{AmountLaxo += baseLaxoFee + profitLaxo;  AmountU += baseUFee + profitU;  AmountEcosystem += profitEcosystem;}}

4. 利润税计算逻辑

solidity

function_calcProfitTax(address sender,uint256 amountUOut,uint112 reserveU,uint112 reserveThis)privatereturns(uint256 profitU,uint256 profitLaxo,uint256 profitEcosystem){uint256 senderCost = tOwnedU[sender];uint256 profit;if(senderCost >= amountUOut){  unchecked { tOwnedU[sender]= senderCost  amountUOut;}return(0,0,0);}elseif(senderCost >0){  profit = amountUOut  senderCost; tOwnedU[sender]=0;}else{ profit = amountUOut;}uint256 profitThis = Helper.getAmountOut(profit, reserveU, reserveThis);uint256 totalProfitFee = profitThis /4;// 利润的 25% 作为税费    profitU = totalProfitFee /5;// 20%    profitLaxo =(totalProfitFee *2)/5;// 40%    profitEcosystem = totalProfitFee  profitU  profitLaxo;// 40%}

5. 交易限额(每次最多转出 99.99%)

solidity

uint256 maxAmount =(balanceOf[sender]*9999)/10000;if(amount > maxAmount){  amount = maxAmount;}

6. 卖出冷却机制

solidity

mapping(address=>uint40)public lastBuyTime;// 买入时记录时间lastBuyTime[recipient]=uint40(block.timestamp);// 卖出时检查冷却require(block.timestamp >= lastBuyTime[sender]+ coldTime,“cold”);

说明

免手续费地址可绕过所有限制,但仅项目运行中的必要地址拥有该特权,如1、部署者地址(msg.sender);2、合约本身地址(address(this));3、质押合约地址;4、路由地址。

最后结论:LAX合约检查未见明显漏洞及后门

关注持续更新

风险提示:以上信息仅供分享交流,不构成任何投资理财建议。

搜索加入

公众号|小鱼儿技术

         分析团队

技术含量爆表的

           公众号