# IPoolFactory

## Interface Description

License: MIT

##

```solidity
interface IPoolFactory
```

This is the Factory contract for the gov pools. Anyone can create a pool for themselves to become a governance owner (GovPool)

## Enums info

### VotePowerType

```solidity
enum VotePowerType {
	 LINEAR_VOTES,
	 POLYNOMIAL_VOTES,
	 CUSTOM_VOTES
}
```

The enum that holds information about calculating vote power

Parameters:

| Name              | Description                                       |
| ----------------- | ------------------------------------------------- |
| LINEAR\_VOTES     | the vote power = number of tokens                 |
| POLYNOMIAL\_VOTES | the vote power calculated with polynomial formula |
| CUSTOM\_VOTES     | the vote type defined by a customer               |

## Structs info

### SettingsDeployParams

```solidity
struct SettingsDeployParams {
	IGovSettings.ProposalSettings[] proposalSettings;
	address[] additionalProposalExecutors;
}
```

General settings of the pool

Parameters:

| Name                        | Type                                    | Description                                     |
| --------------------------- | --------------------------------------- | ----------------------------------------------- |
| proposalSettings            | struct IGovSettings.ProposalSettings\[] | list of infos about settings for proposal types |
| additionalProposalExecutors | address\[]                              | list of additional proposal executors           |

### ValidatorsDeployParams

```solidity
struct ValidatorsDeployParams {
	string name;
	string symbol;
	IGovValidators.ProposalSettings proposalSettings;
	address[] validators;
	uint256[] balances;
}
```

Parameters of validators

Parameters:

| Name             | Type                                   | Description                                      |
| ---------------- | -------------------------------------- | ------------------------------------------------ |
| name             | string                                 | the name of a token used by validators           |
| symbol           | string                                 | the symbol of a token used by validators         |
| proposalSettings | struct IGovValidators.ProposalSettings | struct with settings for proposals               |
| validators       | address\[]                             | list of the validator addresses                  |
| balances         | uint256\[]                             | list of initial token balances of the validators |

### UserKeeperDeployParams

```solidity
struct UserKeeperDeployParams {
	address tokenAddress;
	address nftAddress;
	uint256 individualPower;
	uint256 nftsTotalSupply;
}
```

Parameters of the user keeper

Parameters:

| Name            | Type    | Description                           |
| --------------- | ------- | ------------------------------------- |
| tokenAddress    | address | address of the tokens used for voting |
| nftAddress      | address | address of the NFT used for voting    |
| individualPower | uint256 | the voting power of an NFT            |
| nftsTotalSupply | uint256 | the NFT collection size               |

### VotePowerDeployParams

```solidity
struct VotePowerDeployParams {
	IPoolFactory.VotePowerType voteType;
	bytes initData;
	address presetAddress;
}
```

The voting power parameters

Parameters:

| Name          | Type                            | Description                                                   |
| ------------- | ------------------------------- | ------------------------------------------------------------- |
| voteType      | enum IPoolFactory.VotePowerType | type of algorythm to calculate votes number from token number |
| initData      | bytes                           | initialization data for standard contract types               |
| presetAddress | address                         | address of custom contract (for custom voteType)              |

### GovPoolDeployParams

```solidity
struct GovPoolDeployParams {
	IPoolFactory.SettingsDeployParams settingsParams;
	IPoolFactory.ValidatorsDeployParams validatorsParams;
	IPoolFactory.UserKeeperDeployParams userKeeperParams;
	IERC20Gov.ConstructorParams tokenParams;
	IPoolFactory.VotePowerDeployParams votePowerParams;
	address verifier;
	bool onlyBABTHolders;
	string descriptionURL;
	string name;
}
```

The pool deploy parameters

Parameters:

| Name             | Type                                       | Description                                                         |
| ---------------- | ------------------------------------------ | ------------------------------------------------------------------- |
| settingsParams   | struct IPoolFactory.SettingsDeployParams   | general settings of the pool                                        |
| validatorsParams | struct IPoolFactory.ValidatorsDeployParams | parameters of validators                                            |
| userKeeperParams | struct IPoolFactory.UserKeeperDeployParams | parameters of the user keeper                                       |
| tokenParams      | struct IERC20Gov.ConstructorParams         | the gov token parameters                                            |
| votePowerParams  | struct IPoolFactory.VotePowerDeployParams  | vote power parameters                                               |
| verifier         | address                                    | the address of the verifier                                         |
| onlyBABTHolders  | bool                                       | if true, only KYCed users will be allowed to interact with the pool |
| descriptionURL   | string                                     | the description of the pool                                         |
| name             | string                                     | the name of the pool                                                |

### GovPoolPredictedAddresses

```solidity
struct GovPoolPredictedAddresses {
	address govPool;
	address govTokenSale;
	address govToken;
	address distributionProposal;
	address expertNft;
	address nftMultiplier;
}
```

The predicted pool addresses given tx.origin and GovPool name

Parameters:

| Name                 | Type    | Description                                |
| -------------------- | ------- | ------------------------------------------ |
| govPool              | address | the predicted govPool address              |
| govTokenSale         | address | the predicted govTokenSale address         |
| govToken             | address | the predicted govToken address             |
| distributionProposal | address | the predicted distributionProposal address |
| expertNft            | address | the predicted expertNft address            |
| nftMultiplier        | address | the predicted nftMultiplier address        |

## Functions info

### deployGovPool (0x0cc3c11c)

```solidity
function deployGovPool(
    IPoolFactory.GovPoolDeployParams calldata parameters
) external
```

This function is used to deploy DAO Pool with TokenSale proposal

Parameters:

| Name       | Type                                    | Description                |
| ---------- | --------------------------------------- | -------------------------- |
| parameters | struct IPoolFactory.GovPoolDeployParams | the pool deploy parameters |

### predictGovAddresses (0x17278f74)

```solidity
function predictGovAddresses(
    address deployer,
    string calldata poolName
) external view returns (IPoolFactory.GovPoolPredictedAddresses memory)
```

The view function that predicts the addresses where the gov pool proxy, the gov token sale proxy and the gov token will be stored

Parameters:

| Name     | Type    | Description                                    |
| -------- | ------- | ---------------------------------------------- |
| deployer | address | the user that deploys the gov pool (tx.origin) |
| poolName | string  | the name of the pool which is part of the salt |

Return values:

| Name | Type                                          | Description             |
| ---- | --------------------------------------------- | ----------------------- |
| \[0] | struct IPoolFactory.GovPoolPredictedAddresses | the predicted addresses |


---

# 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://docs.dexe.network/contract-interfaces/factory-contracts/ipoolfactory.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.
