> For the complete documentation index, see [llms.txt](https://docs.kpk.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.kpk.io/funds/infrastructure/onchain-accounting/meta-balance-adapters/pancakeswap-v2.md).

# PancakeSwap V2

The PancakeSwap V2 adapter reports an account's V2 LP across any pair as the dilution-adjusted pro-rata share of both reserves, emitted as one `Supplied` leg per token. PancakeSwap V2 shares the Uniswap V2 Pair/Factory ABI and pro-rata math, so this is a thin subclass of the [Uniswap V2](/funds/infrastructure/onchain-accounting/meta-balance-adapters/uniswap-v2.md) meta-adapter. It differs in two respects: the reported protocol slug, and its `_mintFee` protocol-fee fraction, which is **not** Uniswap's — it overrides the dilution coefficients accordingly. A single immutable meta-adapter serves every pair; the active pair set lives on NAVCalculator.

* **Type:** Meta-adapter
* **protocolSubId:** `keccak256("pancakeswap-v2")`
* **Instance key:** the PancakeSwap V2 pair address, widened to bytes32.
* **Source:** [`PancakeSwapV2PoolsMetaBalanceAdapter.sol`](https://github.com/karpatkey/onchain-accounting/blob/main/src/balances/MetaBalanceAdapters/pancakeswap/PancakeSwapV2PoolsMetaBalanceAdapter.sol)

***

## Positions returned

Per pair instance, up to two legs:

| Leg          | PositionKind | isDebt  | Description                          |
| ------------ | ------------ | ------- | ------------------------------------ |
| token0 share | `Supplied`   | `false` | Account's pro-rata share of reserve0 |
| token1 share | `Supplied`   | `false` | Account's pro-rata share of reserve1 |

Legs with zero amount, unregistered assets, or assets excluded by `assetFilter` are dropped.

***

## Balance calculation

<figure><img src="/files/JYdVE6nRshbLUNjWNNaB" alt="Flowchart of the PancakeSwap V2 balance adapter: read calls derive position legs into PositionBalance entries."><figcaption><p>PancakeSwap V2 adapter — how the underlying balances reported to the NAV Calculator are derived.</p></figcaption></figure>

Delegated to `UniswapV2PairLib.pairAmounts(pair, account, ...)`, same as [Uniswap V2](/funds/infrastructure/onchain-accounting/meta-balance-adapters/uniswap-v2.md) but with PancakeSwap's own `_mintFee` coefficients. The account's LP balance is converted to underlying reserves against an effective supply that includes the protocol fee LP the pair would mint on its next mint/burn:

```
balance         = pair.balanceOf(account)
totalSupply     = pair.totalSupply()
(r0, r1)        = pair.getReserves()
effectiveSupply = totalSupply + pendingProtocolMint        // V2 _mintFee dilution

amount0 = balance × r0 / effectiveSupply
amount1 = balance × r1 / effectiveSupply
```

with PancakeSwap V2's `_mintFee` coefficients `(numFactor, rootKCoeff, rootKLastCoeff) = (8, 17, 8)`, overriding Uniswap's `(1, 5, 1)` via the `_mintFeeConstants()` hook:

```
pendingProtocolMint = totalSupply × (√k − √kLast) × 8 / (17·√k + 8·√kLast)
```

PancakeSwap's protocol-fee fraction is larger than Uniswap's; using Uniswap's `(1, 5, 1)` constants would understate the dilution LP and slightly overstate the holder's reserve share whenever PancakeSwap's `feeTo` is set.

It is 0 when `feeTo` is unset, `kLast == 0`, or `√k <= √kLast` (read defensively).

***

## Identity

* **positionId:** `abi.encode(address pair)` — one positionId per pair instance (same schema as Uniswap V2).
* **positionKind:** `Supplied` for both legs.

There is no `labels` field on the position. The adapter implements `positionLabels(positionId)`, which returns `["AMM Liquidity Pool", "sym0/sym1"]` from the pair's on-chain token symbols — surfaced only by the verbose reads (`getAccountPositionsVerbose` / `getAccountNavVerbose`); the full breadcrumb is `[protocolName, ...labels]`.

***

## Constructor

```solidity
constructor(
    address navCalculator_
)
```

| Parameter        | Description                                      |
| ---------------- | ------------------------------------------------ |
| `navCalculator_` | NAVCalculator contract for asset-registry access |

No protocol addresses are pinned — every pair is self-describing.

***

## Registration

Register the adapter once with `addMetaBalanceAdapter`, then enable each pair with `addMetaInstances`. The instance coordinate is the PancakeSwap V2 pair address widened to bytes32. The adapter holds no instance state — it reads its active set from `NAV_CALCULATOR.getMetaInstances(address(this))`.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.kpk.io/funds/infrastructure/onchain-accounting/meta-balance-adapters/pancakeswap-v2.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
