Deployment audit report · PulseChain mainnet · chain id 369

Zxo on PulseChain Deployment Report

Verified source · exact match
Date
5 October 2026
Based on
Security Audit Revision 3.1
Compiler
solc 0.8.36
commit 8a079791
Build settings
Optimizer 200 runs · Shanghai · via-IR off
Main DEX
LibertySwap V3 (PancakeSwap-style)
Reviewer
Claude (Anthropic), AI-assisted
01

Statement

Audit score
8.8/10
8.7 → 8.8 in Revision 3.1

Score of the audited code as deployed. It is not a rating of the tokens, the team or any investment.

The Zxo contracts deployed on PulseChain mainnet at the six addresses in section 02 are built from the source code reviewed in the Zxo Security Audit. Sourcify reports an exact match of creation and runtime bytecode for each one. It is the same code that runs on Arbitrum One.

The deployed source differs from the reviewed files in three places only: the BUSL-1.1 license header on each file, the ChainLib import (now PulseChainLib.sol), and the PulseChain addresses and HOLDER settings inside PulseChainLib.sol.

No audit finding is open in the deployed code, and no path was found that lets anyone take user principal. The protocol ran as audited on LibertySwap, a PancakeSwap-style V3 DEX: nine pools launched in the enforced order, and a live reward claim was reproduced to the last wei.

The open items are operational (section 08): the owner is a single wallet, and no static-analysis or third-party audit report was provided to this review.

6Contracts with exact-match source
9Pools launched in the enforced order
100Zxo transactions reviewed
0Differences from audited logic
02

Deployed contracts

ContractAddress (links to Sourcify)BlockVerified (UTC)Bytecode
ZxoTreasury
Fee and referral receiver
0x923cbe1C05e9c0014D6514a506A8E74B9254FF86277042885 Oct 2026 11:30Exact match
ZxoOracle
15-minute average price reader
0xC8CaA5F5961d4679C79A18731C53b6023Ac8862B277043195 Oct 2026 11:31Exact match
ZxoVerify (first run)
Configuration check before the deployer
0xa8D7A6A9291E60400F0CA64c5dfed64997Cd3817277043336 Oct 2026 00:51Exact match
ZxoV3Deployer
Seeds other DEXes, then finalizes
0x3D62C13A12F246A2CAC2d7fCe1A43D63ED253FBE277043495 Oct 2026 11:33Exact match
ZxoVerify (second run)
Configuration check with the deployer
0x923028273B38b24fb98F846f0e4c809fAB58523f277043756 Oct 2026 00:52Exact match
Zxo
Farm, staking, rewards, core LP
0x813984963d4e0CC7fF5d04E830767fe63D815B0A277043945 Oct 2026 11:34Exact match

All six were deployed on 3 October 2026 by 0x98C3eEc2b28D82b05edfA3D40F8A468a58BD1e24, an externally owned account that is also the current owner of Zxo. The order on-chain was ZxoTreasury, ZxoOracle, ZxoVerify, ZxoV3Deployer, ZxoVerify again, then Zxo at 16:46 UTC, followed by ZxoV3Deployer.setZxoContract(Zxo) at block 27704538. That is the order the audit requires. Both ZxoVerify deployments succeeded, and ZxoVerify reverts unless its checks pass.

The nine reward tokens are ZxoToken instances created by Zxo.createPool from the same token source. No reward token address was submitted for separate verification, so they are covered through the Zxo build, which contains the token code.

03

Deployed source against audited source

Hash match keccak256 in the Sourcify metadata equals the hash of the reviewed file Line match verified source compared line by line with the reviewed file
FileMethodkeccak256 of deployed fileResult
contracts/ZxoTreasury.solHash match0x7fe7c3597e1ce0a7d1a47af5d8be8c6790ffe8e45a3e25ab8da0b671fd7168eaIdentical to the reviewed file
contracts/ZxoOracle.solHash match0xece409c3f72fb085760937016f8814eb054fd3bac85d914f881cdf4aa9b187b3Identical to the reviewed file
contracts/ZxoV3Deployer.solHash match0x21a2fcf6c4845487ce4e4bc1706e70ea7d54c1b4aee1c697bc15fd0ca18ae07cIdentical; import switched to PulseChainLib
contracts/ZxoVerify.solHash match0xcfda46a8ab850909f1dda4f844190438c0ff81b1c85af4e31d0e85651eee4779Identical; import switched to PulseChainLib
contracts/interfaces/IZxo.solHash match0x585cf1d293808b83e594f728c802a9af8b8d2f46ed657a4f3868347513f1d720Identical to the reviewed file
contracts/interfaces/IZxoOracle.solHash match0x18f282e363125d95b610fbe5f0a5fc0a2d6e2a0e5adec5943a1b5b30399de13eIdentical to the reviewed file
contracts/interfaces/Iv3PosManager.solHash match0x982265f349185d696df1f26f1954c203c0ac4bc7498ae34b2001edd61dc1a917Identical to the reviewed file
contracts/interfaces/IUniswapV3.solHash match0xb0a9deea3bcffc41b32de19bfdf5100d138914f070f882238e18208942c4875aIdentical to the reviewed file
contracts/libraries/PulseChainLib.sol
first ZxoVerify and ZxoV3Deployer
Hash match0xd0cb26af18a7dd18872a6f910cb5c29998c90e64bca50399c41185838dae3dadTreasury and oracle set, deployer still zero, HOLDER settings as in section 04
contracts/libraries/PulseChainLib.sol
second ZxoVerify and Zxo
Hash match0x22ad53a7a2ad2bde4c76fca9f3f3ef59ffde50211f497bec90715a207feaa789All three Zxo addresses set. The copy compiled into Zxo reads the same line for line
contracts/Zxo.solLine match0x48a1be203e0ce18d0741af8144f37ffb120dd89937467915edd6ac15ccc9e6ff
expected value, see note
907 lines compared, no difference; import switched to PulseChainLib
contracts/libraries/ZxoLib.solLine match0x5824ce7e7131aa46ed589ba47d7178c5c442a349eff7c7f97b52ccca6a7f200b
expected value, see note
428 lines compared, no difference
contracts/tokens/ZxoToken.solLine match0x52566870113cb2dea33c69495c8a3c31e775283ed0e2e9ceeb55b43d33dfb00a
expected value, see note
83 lines compared, no difference
contracts/interfaces/IZxoToken.solLine match0x3f5b34c68c2abafacea47bdb3a9ee7b0ad0e89a19091e56cbb8cc7873bb929ae
expected value, see note
No difference
contracts/interfaces/IZxoV3Deployer.solLine match0x5865997e0c6674cd4ced4204abb6c3dfaba0f14ed91c0de32ea3284aa1b42617
expected value, see note
No difference

Hash match. The compiler metadata embedded in each deployment lists a keccak256 hash for every source file. For the files marked Hash match, that hash equals the hash of the reviewed file with the published license header (Change Date 2029-10-03) placed in front. This is an exact, byte-level result. It covers ten files here, including both versions of PulseChainLib.sol and ZxoVerify.sol.

Line match. The Zxo metadata is too large for this review's reader to reach the hashes of the files compiled only into Zxo. Those files were read from the Sourcify-verified input and compared with the reviewed files line by line, ignoring whitespace. No line differs. The hash shown is the value the reviewed file produces; anyone can confirm it against metadata.json on Sourcify.

Interface. The verified ABI of Zxo has 24 functions, 3 events and 4 errors and is the same as on Arbitrum. The OpenZeppelin files carry the same hashes as in the Arbitrum deployment; they were not compared with an upstream release.

04

Configuration compiled into Zxo

Constant (PulseChainLib)ValueNote
CHAIN_ID369PulseChain mainnet
POS_MANAGER0x19b1347900840e7a299F339868881750918FAD91LibertySwap position manager
FACTORY0x796fcbDC956b85797EFe21145Aa97599B7FB36a6LibertyV3Factory, verified on Sourcify
ZXO_TREASURY0x923cbe1C05e9c0014D6514a506A8E74B9254FF86Matches section 02
ZXO_V3_DEPLOYER0x3D62C13A12F246A2CAC2d7fCe1A43D63ED253FBEMatches section 02
ZXO_ORACLE0xC8CaA5F5961d4679C79A18731C53b6023Ac8862BMatches section 02
HOLDER_TOKEN0xDb3fF08284f0874860281b3A84a0D48ab25040d6Labelled DYNASTY in the source. Was zero in the reviewed library
HOLDER_THRESHOLD3,690,000,000 tokensWas zero in the reviewed library
What a successful Zxo deployment proves The Zxo constructor reverts unless every check passes, so the deployment at block 27704394 shows that on that block: the chain id was 369; all six configured addresses held code; the LibertySwap position manager used the configured factory; the 0.01% fee tier had tick spacing 1; the HOLDER token reported 18 decimals and the threshold was at least one token; the treasury and deployer returned their identity markers; the deployer was not yet linked to another Zxo; and the oracle reported its 15-minute window. It also shows the contract fits the 24,576-byte size limit under the Shanghai EVM that PulseChain supports.
05

LibertySwap, a PancakeSwap-style V3 DEX

The original audit's finding H-02 was that a typed slot0() read reverts on PancakeSwap-style V3 pools, because those pools return one field in a different size from Uniswap. It would have blocked stake and harvest. The fix reads the price with a low-level call and decodes only the two fields every V3 fork shares.

PulseChain is the first deployment where the main pools are that pool type. The LibertyV3Factory is verified on Sourcify, and its interface has the functions that PancakeSwap added to the Uniswap V3 factory (poolDeployer, setLmPoolDeployer, setWhiteListAddress, and setFeeProtocol with a pool argument).

Code path on a LibertySwap poolSeen on mainnetResult
Create the pool, then read its price and require the launch price (initializePool, core)9Worked
Health gate: spot price read and 15-minute average through observe (stake, harvest)22Worked
Mint positions through the LibertySwap position manager (pool initialization and stake)34Worked
Collect core LP trading fees to the treasury1Worked

This confirms the H-02 fix on a live PancakeSwap-style pool. PancakeSwap itself on BNB Chain has not been run, but it uses the same pool design and the same Zxo code path, so the remaining risk there is low. The health gate count is the 16 stake and 6 harvest transactions. The mint count is the 18 successful pool initializations and the 16 stakes.

06

On-chain activity reviewed

Transactions and events for Zxo and ZxoV3Deployer were read through the PulseChain explorer API, from deployment on 3 October 2026, 16:46 UTC to 5 October 2026, 22:39 UTC: 100 Zxo transactions with 119 ZxoEvent logs, and all 38 ZxoV3Deployer transactions with their 39 logs.

Functions exercised on mainnet

OperationSeenWhat it confirms
Pool launch: createPool, core LP, seed, finalize, core stake9 poolsAll nine followed the enforced order. Every reward token was finalized before its core stake was minted.
Seeding on other DEXes27Three position managers per pool (section 07). Each TokenFinalized event followed the third seeding.
Stake16The health gate passed on LibertySwap pools: spot price and 15-minute average both read and in range.
Harvest (claim and collect)6Rewards were minted on claim and trading fees were forwarded.
Unstake2Positions were held 27.1 and 24.4 hours, past the 1-day lock-up. Forfeited pending rewards were logged, not minted.
Core LP fee collection1133.09 pair tokens of trading fees from pool 0's core LP went to the treasury. Core liquidity was not touched.
HOLDER bonus8 stakesStakes from qualifying wallets received 13.74%, exactly 1.25 times the standard 10.99%.
Config changes and rate re-targeting17 + 24Target APR and referral rates logged the stored value; emission rates re-targeted after each.
ZxoV3Deployer set-up1The validator was set to the zero address at deployment, which disables the testnet-only token path. setZxoContract was called once.

Numbers recomputed from the audited formulas

Check (pool 0)Formula resultOn-chain valueResult
First reward claim, using the contract's integer steps over 6,990 seconds637,524,190,098,746,069 wei637,524,190,098,746,069 weiExact
Staked value counted for emissions with only the core stake present110,385,144.43 tokens110,385,144.43 tokensMatch
Stake bonus at the launch price10% to 12% expected10.99% to 11.00% standardIn range
HOLDER bonus multiplier1.25 ×13.74% ÷ 10.99% = 1.25Exact

The first row reproduces a live claim to the last wei from the reward formula in the audit. The second shows that the single-sided core stake counts toward the value used for emissions (finding M-01): the on-chain figure comes from the first emission rate, and the formula figure from the core-stake liquidity and its tick range.

Who used it

  • 94 of the 100 transactions came from the deployer wallet.
  • Four other addresses sent 6 transactions: 5 stakes and 1 harvest, in pools 6, 7 and 8.
  • This review cannot tell whether those four are team wallets or the public. One of them named a team address as its referrer.

Two failed transactions

  • The first two initializePool(0, core) calls reverted. Each had a 4,000,000 gas limit and used 3,761,352.
  • The third call, with a 7,800,000 limit, succeeded using 5,072,846. Creating the LibertySwap pool needs more than the first limit allowed.
  • A reverted call changes nothing on-chain. This was a gas setting, not a contract fault.
07

Pools and owner settings observed

PoolReward tokenCreated (UTC)Target APR at 5 OctReferral ratePair token
00x4542fD562bBa19AE85e017d5b50Be7C4b16443DF3 Oct 17:2410%3%WPLS
10x27381e9925B58133136297d7dd79dab1F2A1dD323 Oct 21:2515%5.55%HEX
20x3647464C8e72CdB4Ea3Fc58002D2A1C9E0fe2daF4 Oct 01:4121%10%PLSX
30x2dE787C0AB8DeCb4167d43ee00A0eE4d2e3f6f9E4 Oct 03:5912%7%INC
40xbcE06Bb11FF7fEb628eE80589BC70206085A63Be4 Oct 11:4028%16%PRVX
50x518bC3Ce004a6d6f074eD24cE0e6e730786aE99f4 Oct 17:26360%25%INTARSIA
60x8fA5C2a7CD2974b5b817136A986bf5475F3108874 Oct 17:52510%30%ZXO
70x3BfefFA660696417b8068E19E8De1456211063d55 Oct 00:1348%18%PCOCK
80x204250574e7c7BE7fc6AEdD38c365DA651695eaF5 Oct 00:30110%26%pDAI

These settings are within the limits the contract enforces and are the owner's to choose. They are listed so that users can see them; they are not findings.

Core stake size and what it costs stakers

PoolPair tokenCore stake (reward tokens)About, in USDUser stakes beside it, 5 OctStakers earn, share of target APR
0WPLS110,385,144.43$1,030None (test stake withdrawn)n/a
1HEX246,560.14$5900.7% of itabout 50%
2PLSX55,206,463.20$4200.6% of itabout 50%
3INC1,949.70$7900.3% of itabout 50%
4PRVX3,538,570.42$330under 0.01% of itabout 50%
5INTARSIA0.9615$4500.3% of itabout 50%
6ZXO769,033.58$5608 timesabout 90%
7PCOCK36,900.00$3901.3% of itabout 50%
8pDAI217,058.82$360885 timesabout 99.9%
08

Open items

Open not done or not evidenced Team-reported stated by the team, not independently checked
ItemStatusDetail
Owner is a single walletOpenZxo and ZxoV3Deployer are owned by the deployer account. No ownership transfer appears in the logs. The team plans a multisig after all mainnet deployments. Until then one key can create pools, change target APR and referral rates, and collect core LP fees. It cannot touch staked positions, block unstaking or withdraw core liquidity.
Static analysis (Slither or Aderyn)OpenNo report has been provided.
Independent human auditTeam-reportedThe team states that all audits passed. No third-party report was provided to this review, so none is relied on here.
Seeding DEX namesOpenPublish which DEX each of the three seeding position managers belongs to (section 07).
Price history per poolTeam-reportedStakes and harvests succeeded, so the 15-minute average was available. The stored history size of each pool was not read. Run set-observations.py for all nine pools if not already done.
HOLDER settingsTeam-reportedThe token and the 3.69 billion threshold were set after the audit reviewed this library. The bonus worked for qualifying wallets, which suggests the values are the intended ones. Confirm.
Deployment gas limitTeam-reportedUse at least the 7,800,000 limit for initializePool on LibertySwap, as the later calls did.
09

Limits of this report

10

Verify it yourself

Source and bytecode

  • Open each address in section 02 on Sourcify and check that it shows Exact Match.
  • Download metadata.json for Zxo and compare the keccak256 of contracts/Zxo.sol and contracts/libraries/ZxoLib.sol with section 03.
  • Or compile the published standard JSON input with solc 0.8.36 and compare the runtime bytecode with the chain.

Before you stake in a pool

  • ZxoV3Deployer.isFinalized(rewardToken) returns true.
  • The deployer's balance of the reward token is 0.
  • Each PoolStarted event names a position manager you recognize.
  • Zxo.owner() shows who controls pool settings; check whether it is a multisig yet.
  • Zxo.poolInfo(id) shows the target APR and referral rate that apply to you.