源码级解剖: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. owner和marketingAddress 的提款权限
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 合约依赖(可被篡改)
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合约检查未见明显漏洞及后门
关注持续更新


风险提示:以上信息仅供分享交流,不构成任何投资理财建议。
搜索加入
公众号|小鱼儿技术
分析团队
技术含量爆表的
公众号
夜雨聆风