# Xnet call messages with value > 0 lead to inflated circulating supply of child subnet

execBottomUpMsgs skips Call-kind messages when decrementing child subnet circSupply, so value-bearing xnet calls burn funds without reducing supply, inflating circulating supply.

- Payout: Contest reward
- Severity: high
- Program: Recall
- Credited: sin1st3r__
- Disclosed: 2026-03-13
- Write-up quality: 8/10
- Original: https://code4rena.com/reports/2025-02-recall#h-02
- Library page: https://bugbountylibrary.com/r/c4%3A2025-02-recall%3AH-02
- Tags: domain:web3 impact:funds-loss impact:integrity kind:contest platform:code4rena sev:high tech:solidity technique:source-review vuln:accounting-error vuln:business-logic

**Target:** CheckpointingFacet / Gateway cross-net message accounting (Solidity)
**Root cause:** execBottomUpMsgs only subtracts msg.value from subnet.circSupply for non-Call kinds, assuming Call messages never move supply; but Call envelopes can carry value>0, which is burned on commit yet never deducted from circSupply.
**Steps:**
1. Child subnet A has 1,000,000 locked and circSupply=1,000,000 in parent.
2. Attacker in A calls sendContractXnetMessage with kind=Call, value=5000, targeting a contract in child subnet B.
3. commitValidatedCrossMessage commits a bottom-up msg and burns the 5000 (shouldBurn=true).
4. Parent executes checkpoint via execBottomUpMsgs; the Call message is skipped in the totalValue loop, so A's circSupply stays 1,000,000.
5. Parent commits top-down msg to B, incrementing B's circSupply by 5000; B executes performCall and delivers 5000 to target.
6. Result message with value=0 returns to A; A's circSupply never decreases, diverging from locked funds.
**How found:** Code-reading of execBottomUpMsgs revealed the `kind != IpcMsgKind.Call` guard, then traced sendContractXnetMessage to confirm Call envelopes can carry non-zero value that gets burned, contradicting the guard's assumption.
**Exploitation:** Attacker repeatedly bridges value via Call-kind xnet messages between subnets; each round inflates the source subnet's circSupply relative to actually locked funds, breaking the supply==locked-funds invariant and enabling unbacked supply inflation.
**Escalation:** Repeating bridge round-trips between child and parent subnets compounds the circSupply inflation indefinitely.
**Insight:** When an accounting loop filters by message kind, verify whether that kind can still carry value; cross-chain message-type assumptions about value transfer are a recurring source of supply-invariant breaks.
