# Panda Factory

The core factory contract for deploying and managing Panda tokens and pools.

### Deployment Functions

**`deployPandaToken`**

```solidity
function deployPandaToken(
    address implementation,
    PandaPoolParams calldata pp,
    string calldata name,
    string calldata symbol,
    uint16 deployerSupplyBps
) external nonReentrant returns (address pandaToken)
```

Deploys a new PandaToken with optional deployer buy.

**Parameters:**

* `implementation`: Address of the implementation contract
* `pp`: PandaPoolParams struct containing:
  * `baseToken`: Address of the base token
  * `sqrtPa`: Lower bound sqrt price
  * `sqrtPb`: Upper bound sqrt price
  * `vestingPeriod`: Vesting duration for deployer incentives
* `name`: Token name
* `symbol`: Token symbol
* `deployerSupplyBps`: Basis points of supply for deployer (max 5000)

**Returns:**

* `pandaToken`: Address of the deployed token

**Emits:** `PandaDeployed`

**Errors:**

* `PandaFactory: INVALID_DEPLOYER_BUY` - When deployerSupplyBps > 5000
* `PandaFactory: INVALID_IMPLEMENTATION` - When implementation not whitelisted
* `PandaFactory: INVALID_BASE` - When base token not configured
* `PandaFactory: PRICES_TOO_CLOSE` - When price range too narrow
* `PandaFactory: PRICES_TOO_FAR` - When price range too wide
* `PandaFactory: RAISE_TOO_LOW` - When minimum raise not met

**`deployPandaTokenWithBera`**

```solidity
function deployPandaTokenWithBera(
    address implementation,
    PandaPoolParams calldata pp,
    string calldata name,
    string calldata symbol,
    uint16 deployerSupplyBps
) external payable nonReentrant returns (address pandaToken)
```

Deploys a new PandaToken using native BERA with optional deployer buy.

**Parameters:**

* `implementation`: Address of the implementation contract
* `pp`: PandaPoolParams struct containing:
  * `baseToken`: Must be WBERA address
  * `sqrtPa`: Lower bound sqrt price
  * `sqrtPb`: Upper bound sqrt price
  * `vestingPeriod`: Vesting duration for deployer incentives
* `name`: Token name
* `symbol`: Token symbol
* `deployerSupplyBps`: Basis points of supply for deployer (max 5000)

**Returns:**

* `pandaToken`: Address of the deployed token

**Errors:**

* `PandaFactory: INVALID_BERA` - When baseToken is not WBERA
* All errors from deployPandaToken

`deployPandaPool`

```solidity
function deployPandaPool(
    address implementation,
    IPandaFactory.PandaPoolParams calldata pp,
    uint256 totalTokens,
    address pandaToken,
    bytes calldata data
) external nonReentrant returns (address)
```

Deploy a standalone PandaPool implementation.

**Parameters:**

* `implementation`: Address of the pool implementation
* `pp`: PandaPoolParams struct (see above)
* `totalTokens`: Total tokens to be managed by pool
* `pandaToken`: Address of existing Panda token
* `data`: Additional initialization data

**Returns:**

* Address of the deployed pool

**Errors:**

* `PandaFactory: INVALID_IMPLEMENTATION` - When implementation not whitelisted
* `PandaFactory: IS_PANDATOKEN` - When implementation is a token type
* `PandaFactory: INVALID_PANDATOKEN` - When token address is zero

### Incentive Functions

**`claimIncentive`**

```solidity
claimIncentive(
    address _pandaPool
) external
```

Claims deployment incentives after pool graduation.

**Parameters:**

* `_pandaPool`: Address of the graduated pool

**Errors:**

* `PandaFactory: Invalid pool` - When pool not deployed by factory
* `PandaFactory: Incentive already claimed` - When incentive already claimed
* `PandaFactory: Pool not graduated` - When pool hasn't graduated

### View Functions

**`predictPoolAddress`**

```solidity
predictPoolAddress(
    address implementation,
    address deployer
) external view returns (address)
```

Predicts pool address before deployment.

**Parameters:**

* `implementation`: Implementation contract address
* `deployer`: Address of the deployer

**Returns:**

* Predicted address of the pool

**`getSqrtP`**

```solidity
getSqrtP(
    uint256 scaledPrice
) external pure returns (uint256)
```

Converts price to square root format.

**Parameters:**

* `scaledPrice`: Price to convert (scaled by 1e18)

**Returns:**

* Square root price in correct scale

**`getPoolFees`**

```solidity
getPoolFees()
external view returns (PandaFees memory)
```

Get current fee configuration.

**Returns:**

* PandaFees struct containing:
  * `buyFee`: Fee for buying tokens
  * `sellFee`: Fee for selling tokens
  * `graduationFee`: Fee taken at graduation
  * `deployerFeeShare`: Share of graduation fee for deployer

**`isLegitPool`**

```solidity
isLegitPool(
    address _pandaPool
) public view returns (bool)
```

Verify if pool was deployed by factory.

**Parameters:**

* `_pandaPool`: Address to check

**Returns:**

* `true` if pool was deployed by factory

**`allPoolsLength`**

```solidity
allPoolsLength() external view returns (uint)
```

Get total number of deployed pools.

**Returns:**

* Count of all deployed pools

### Constants

```solidity
public constant MIN_TOKENSINPOOL_SHARE = 5000;    // 50%
uint256 public constant MAX_TOKENSINPOOL_SHARE = 9000;    // 90%
uint256 public constant MIN_SQRTP_MULTIPLE = 11_000;      // 1.1x
uint256 public constant MAX_SQRTP_MULTIPLE = 10*10_000;   // 10x
uint256 public constant TOKEN_SUPPLY = 1_000_000_000 * 1e18;
uint16 public constant DEPLOYER_MAX_BPS = 5000;           // 50%
```

### Events

```solidity
PandaDeployed(
    address indexed pandaPool,
    address indexed implementation
)
```

Emitted when new pool is deployed.

```solidity
IncentiveClaimed(
    address indexed pandaPool,
    uint256 amount
)
```

Emitted when deployment incentive is claimed.


---

# Agent Instructions: 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:

```
GET https://documentation.kodiak.finance/developers/panda/smart-contract-reference/panda-factory.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
