Cryptospecting

FACTS // VERIFIED 2026-10-19

PulseX fees: where the 0.29 % goes in v1 and v2

Short answer

Every PulseX swap pays 0.29 %. In v2 pools 0.22 % stays with liquidity providers and 0.07 % goes to the protocol. In v1 pools the protocol receives the entire fee growth — verified on-chain on 2026-10-17, although the code comment says one sixth. The protocol share buys and burns PLSX, minus a 14.29 % developer cut.

Where does the 0.29 % go?

The fee never leaves the pool at the moment of the trade: it stays in the reserves and raises the value of every LP token. Part of that growth is later minted as extra LP tokens to feeTo — the protocol’s fee receiver — but only when someone adds or removes liquidity (_mintFee, PulseXFactory.sol:366-384).

v2 pools v1 pools
Swap fee 0.29 % 0.29 %
Stays with liquidity providers 0.22 % nothing (in effect)
Minted to the protocol (feeTo) 0.07 % — 7/29 of the fee growth the entire fee growth
Code v2 :365, :376 v1 :365, :376
Status matches code comment and chain verified on-chain 2026-10-17; differs from the code comment

The two pool generations use identical pair code except for this one share. Which generation a pool belongs to therefore decides whether liquidity providers earn trading fees.

How does v2 split the fee?

In v2 the denominator of the fee formula is rootK × 22 / 7 + rootKLast (v2 PulseXFactory.sol:376), which mints LP tokens worth 7/29 of the growth of √k to feeTo; the comment above it says the same (:365). Of 0.29 %, 7/29 is 0.07 % per trade for the protocol and 22/29 is 0.22 % for liquidity providers.

Why does v1 send the whole fee to the protocol?

The v1 comment says the protocol should get one sixth (v1 PulseXFactory.sol:365), but the line that computes it is:

uint denominator = rootK.mul(uint(4998) / uint(10000)).add(rootKLast);

uint(4998) / uint(10000) is integer division in Solidity and equals 0. The denominator is therefore just rootKLast, and feeTo receives LP tokens worth the whole growth of √k since the last liquidity event — the entire 0.29 % fee accrued in that period, not a share of it (v1 :376).

For comparison: had the factor been evaluated as 0.4998, the protocol would have received about two thirds of the growth. The actual mints are about 1.5 times that, i.e. all of it.

How was this checked on the chain?

The fee mints were read on the WPLS/PLSX pair of each generation (v1 0x1b45b9148791d3a104184cd5dfe5ce57193a3ee9, v2 0x149b2c629e652f2e89e11cd57e5d4d77ee166f9f). For each mint, the pair’s LP supply and kLast were read at the block before, the reserves were taken from the pair’s Sync event immediately before the mint in the same block, the expected mint was computed with each formula, and the result was compared with the actual Transfer from the zero address to feeTo in the logs.

Pool generation Blocks checked Result
v1 27,806,204 · 27,801,876 · 27,801,755 actual mint = rootKLast formula (whole growth) exactly in all three; about 1.5 × the 4998/10000 formula
v2 (control) 27,818,501 · 27,815,891 · 27,815,684 actual mint = 7/29 formula exactly

The v2 rows confirm that the method reproduces the documented split, so the v1 result is not an artefact of the check. With reserves taken from the end of the previous block instead, the v1 results deviate by up to 0.0087 %, because other trades in the same block came before the mint. Re-checked on 2026-10-17.

Was the v1 behaviour intended?

No official statement has been found that says whether the v1 fee split was intended. The code comment points one way, the arithmetic and the chain the other. This page states what was verified on-chain on 2026-10-17 and does not speculate about intent.

What does this mean for liquidity providers?

Our reading of the code and the check above:

  • v2 pools pay liquidity providers 0.22 % of every trade, like a normal Uniswap v2 pool with a protocol fee.
  • v1 pools: each time liquidity is added or removed, the protocol mints itself LP tokens worth all the fee growth since the previous such event. Liquidity providers in v1 pools therefore earn no fee income from trades; they keep only the pool position and its price exposure. More PLSX is bought and burned instead.

Before adding liquidity, check whether the pool is a v1 or a v2 pair: the pair contract’s factory value on the explorer is either the v1 factory 0x1715a3E4A142d8b698131108995174F37aEBA10D or the v2 factory 0x29eA7545DEf87022BAdc76323F373EA1e707C523.

What happens to the protocol’s share?

The feeTo address of each factory is a PLSX buy-and-burn contract (v1: 0xd46bd969d995a122ad5b803a45d309021a647b87, v2: 0xd6ca7ee047a6f45d20d2962e4394e070cf27724f, both upgradeable proxies with the same code). It redeems the LP tokens it received for the underlying tokens, swaps them step by step towards WPLS and then PLSX, and burns the PLSX (PLSXBuyAndBurnUpgradeable.sol:192-291).

From each batch of bought PLSX (:253-263):

Share Goes to Setting on 2026-10-17
devCut developer address 0x3239713576e11082cf9b9cda9b77468ea644c682 1429 basis points = 14.29 %
BOUNTY_FEE the whitelisted caller who triggers the conversion 10 basis points = 0.10 % of the rest
remainder burned with PLSX.burn —

For a v2 trade this means roughly 0.07 % × 14.29 % ≈ 0.01 % of volume to the developer address and about 0.06 % of volume used to buy and burn PLSX. For v1 pools the same split applies to the whole fee (about 0.04 % and 0.25 %, before the costs of the conversion swaps). Conversions can only be triggered by whitelisted addresses (anyAuth = false, :192-196).

Who can change the buy-and-burn?

Power Limit in code Holder on 2026-10-17
Raise or lower devCut at most 50 % (:111-116) owner 0x1aac90d3409609dd61ab62ad72372ba9c4d24a40 (a single-key address, no contract code)
Set the caller bounty at most 50 % (:118-121) same owner
Change the developer address any non-zero address (:123-129) the owner or the developer address itself
Add or revoke callers, allow anyone to call — (:96-109) same owner
Set swap routes per token, set the slippage setting, switch off the slippage check or the swap guard per token slippage setting below 20 (:141-166) whitelisted callers
Upgrade the contract (UUPS) none (:302) same owner
Point feeTo to another address — (PulseXFactory.sol:540-548) feeToSetter 0x3a27c0a67d6bbc3dc024af200bb309cb1fe1f091

One setting deserves a note: the burn amount is only computed inside the bounty branch (:258-263). If the owner set BOUNTY_FEE to 0, PLSX.burn would be called with 0 — burning would stop without any upgrade, the bought PLSX would stay in the contract, and each later conversion would still pay the developer cut out of that balance. On 2026-10-17 the bounty was 10 basis points, so burning works.

These are on-chain powers visible in the verified source; none of them can touch liquidity in the pools. They do mean that what happens to the protocol’s share after the swap — not the 0.29 % itself — depends on single-key owners and on the whitelisted callers. Re-check the current values on the explorer before relying on them.

How much PLSX has been burned?

The contract reports burnedPLSX() as starting supply minus current supply (:90-93). On 2026-10-19 (block 27,837,219): 1,793,575,624,782.03 PLSX burned out of a starting supply of 143,116,599,865,548.70 PLSX — about 1.25 %. More about the token: PLSX.

Frequently asked questions

Do I earn trading fees as a liquidity provider on PulseX?

In v2 pools, yes: 0.22 % of every trade stays in the pool. In v1 pools, the on-chain check shows the protocol takes the whole fee growth each time liquidity is added or removed, so v1 liquidity providers in effect earn no fee income; they keep only the pool position itself.

Is the PLSX buy-and-burn real?

Yes. The fee receiver contract converts its LP tokens into PLSX and calls burn; the running total is public as burnedPLSX() — 1,793,575,624,782.03 PLSX on 2026-10-19. 14.29 % of the bought PLSX goes to a developer address instead of being burned.

Did PulseX say the v1 behaviour was intended?

No official statement on it has been found. The code comment says one sixth; the code and the chain show the whole fee growth. The portal reports what the chain shows and will add an official explanation if one is published.

Sources // last verified 2026-10-19

  1. T1 · Primary PulseX v1 factory and pair — verified source (PulseScan)
  2. T1 · Primary PulseX v2 factory and pair — verified source (PulseScan)
  3. T1 · Primary PLSX buy-and-burn, v1 fee receiver — proxy and source (PulseScan)
  4. T1 · Primary PLSX buy-and-burn, v2 fee receiver — proxy and source (PulseScan)
  5. T1 · Primary PulseX v1 router (PulseScan)
  6. T1 · Primary WPLS/PLSX pair, PulseX v1 — fee mints and Sync events (PulseScan)
  7. T1 · Primary WPLS/PLSX pair, PulseX v2 — fee mints and Sync events (PulseScan)

Source tiers are explained in Sources & methodology.