# Aggregator Factory Contract

The Aggregator Factory Contract on Maven Finance is designed to streamline the creation of new Aggregator contract instances within the ecosystem.&#x20;

By providing a standardized model for deploying new aggregators through Governance, the Aggregator Factory Contract promotes scalability and ensures consistency across Maven Finance's oracle network.&#x20;

It plays a crucial role in Maven Finance's data infrastructure, supporting the platform's commitment to reliable and accurate data feeds.

### Aggregator Factory Entrypoints

#### createAggregator

`function createAggregator(string aggregatorName, bool addToGeneralContracts, oracleLedgerMapType oracleLedger, aggregatorConfigType aggregatorConfig, bytes metadata)`

Creates a new standard aggregator contract

<table><thead><tr><th width="249.33333333333331">Param Name</th><th width="307">Type</th><th>Description</th></tr></thead><tbody><tr><td>aggregatorName</td><td>string</td><td>The reference name of the new aggregator to be created</td></tr><tr><td>addToGeneralContracts</td><td>bool</td><td>If set to true, the new aggregator contract will be added to the General Contracts map on the Governance Contract</td></tr><tr><td>oracleLedger</td><td>oracleLedgerMapType:<br>map(address oracleAddress,<br>oracleInformationType oracleInformation)</td><td>Map of oracles to be added to the newly created aggregator contract</td></tr><tr><td>oracleAddress</td><td>address</td><td>The address of the oracle </td></tr><tr><td>oracleInformation</td><td>oracleInformationType:<br>key oraclePublicKey<br>string oraclePeerId</td><td>The information required by each oracle</td></tr><tr><td>oraclePublicKey</td><td>key</td><td>The public key of the oracle</td></tr><tr><td>oraclePeerId</td><td>string</td><td>The peerId of the oracle - providing a unique reference to the oracle within the overall peer-to-peer network</td></tr><tr><td>metadata</td><td>bytes</td><td>The hash of the aggregator metadata </td></tr></tbody></table>

#### trackAggregator

`function trackAggregator(address aggregatorAddress)`

Tracks an aggregator contract and adds it to the trackedAggregators set on the Aggregator Factory Contract

{% hint style="info" %}
Can be called only by the admin (i.e. the governance proxy contract)
{% endhint %}

<table><thead><tr><th width="249.33333333333331">Param Name</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td>aggregatorAddress</td><td>address</td><td>The contract address of the aggregator to be tracked</td></tr></tbody></table>

#### untrackAggregator

`function untrackAggregator(address aggregatorAddress)`

Untracks an aggregator contract and removes it from the trackedAggregators set on the Aggregator Factory Contract

{% hint style="info" %}
Can be called only by the admin (i.e. the governance proxy contract)
{% endhint %}

<table><thead><tr><th width="249.33333333333331">Param Name</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td>aggregatorAddress</td><td>address</td><td>The contract address of the aggregator to be untracked</td></tr></tbody></table>

### Aggregator **Entrypoints**

#### distributeRewardXtz

`function distributeRewardXtz(address recipient, nat reward)`

Distributes rewards from the Aggregator to the oracle recipient

{% hint style="info" %}
Can be called only by a tracked aggregator contract
{% endhint %}

| Param Name | Type    | Description                                          |
| ---------- | ------- | ---------------------------------------------------- |
| recipient  | address | The address of the oracle to receive the rewards     |
| reward     | nat     | The total amount of rewards in xtz to be distributed |

#### distributeRewardStakedMvn

`function distributeRewardStakedMvn(set(address) eligibleOracles, nat totalStakedMvnReward)`

Distributes staked MVN rewards equally to each address specified in the eligibleOracles set

{% hint style="info" %}
Can be called only by a tracked aggregator contract
{% endhint %}

| Param Name      | Type         | Description                                                 |
| --------------- | ------------ | ----------------------------------------------------------- |
| eligibleOracles | set(address) | A set of oracle addresses to receive rewards                |
| reward          | nat          | The total amount of rewards in staked MVN to be distributed |

### Housekeeping **Entrypoints**

#### setAdmin

`function setAdmin(address newAdminAddress)`

Sets a new admin address for the contract

{% hint style="info" %}
Can be called only by the admin or the governance contract address
{% endhint %}

| Param Name      | Type    | Description                  |
| --------------- | ------- | ---------------------------- |
| newAdminAddress | address | The address of the new admin |

#### setGovernance

`function setGovernance(address newGovernanceAddress)`

Sets a new governance contract address

{% hint style="info" %}
Can be called only by the admin or the governance contract address
{% endhint %}

| Param Name           | Type    | Description                                |
| -------------------- | ------- | ------------------------------------------ |
| newGovernanceAddress | address | The address of the new governance contract |

#### updateMetadata

`function updateMetadata(string key, bytes hash)`

Replace the hash of the contract metadata based on the provided key

{% hint style="info" %}
Can be called only by the admin (i.e. the governance proxy contract)
{% endhint %}

| Param Name | Type   | Description                                  |
| ---------- | ------ | -------------------------------------------- |
| key        | string | The key in the metadata bigmap to be updated |
| hash       | bytes  | The hash of the metadata key                 |

#### updateConfig

`function updateConfig(nat newConfigValue, aggregatorFactoryConfigActionType aggregatorFactoryConfigAction)`

Updates the config variables on the Aggregator Factory Contract

{% hint style="info" %}
Can be called only by the admin (i.e. the governance proxy contract)
{% endhint %}

<table><thead><tr><th width="296">Param Name</th><th width="343.3333333333333">Type</th><th>Description</th></tr></thead><tbody><tr><td>newConfigValue</td><td>nat</td><td>The new value of the config parameter</td></tr><tr><td>aggregatorFactoryConfigAction</td><td>aggregatorFactoryConfigActionType: <br>| unit ConfigAggregatorNameMaxLength<br>| unit Empty</td><td>The variant config variable to be updated</td></tr></tbody></table>

#### updateWhitelistContracts

`function updateWhitelistContracts(address whitelistContractAddress, updateType update)`

Add, update or remove a whitelist contract in the whitelistContracts map in the storage

{% hint style="info" %}
Can be called only by the admin (i.e. the governance proxy contract)
{% endhint %}

| Param Name               | Type                | Description                                                          |                 |                                                                                                                 |
| ------------------------ | ------------------- | -------------------------------------------------------------------- | --------------- | --------------------------------------------------------------------------------------------------------------- |
| whitelistContractAddress | address             | The contract address to be updated in the whitelist contracts bigmap |                 |                                                                                                                 |
| updateType               | <p>updateType: <br> | unit Update  <br>                                                    | unit Remove</p> | Specifies whether the whitelistContractAddress should be updated or removed from the whitelist contracts bigmap |

#### updateGeneralContracts

`function updateGeneralContracts(string generalContractName, address generalContractAddress, updateType update)`

Add, update or remove a general contract in the generalContracts map in the storage

{% hint style="info" %}
Can be called only by the admin (i.e. the governance proxy contract)
{% endhint %}

| Param Name             | Type                | Description                                                                                                       |                 |                                                                                                             |
| ---------------------- | ------------------- | ----------------------------------------------------------------------------------------------------------------- | --------------- | ----------------------------------------------------------------------------------------------------------- |
| generalContractName    | string              | The identifier key to be set in the general contracts bigmap which will be the general contract name in camelcase |                 |                                                                                                             |
| generalContractAddress | address             | The contract address to be updated in the general contracts bigmap                                                |                 |                                                                                                             |
| updateType             | <p>updateType: <br> | unit Update <br>                                                                                                  | unit Remove</p> | Specifies whether the generalContractAddress should be updated or removed from the general contracts bigmap |

#### mistakenTransfer

`function mistakenTransfer(transferActionType transferList)`

Transfers any mav or token that may have mistakenly been sent to this contract

{% hint style="info" %}
Can be called only by the admin or the governance satellite contract
{% endhint %}

<table><thead><tr><th width="196.33333333333331">Param Name</th><th width="331">Type</th><th>Description</th></tr></thead><tbody><tr><td>transferList</td><td><p>transferActionType:</p><p>list(address to_, <br>nat tokenAmount, <br>token tokenType)</p></td><td>A list of transfers of tokens to recipients</td></tr><tr><td>to_</td><td>address</td><td>The recipient of the mistaken transfer</td></tr><tr><td>tokenAmount</td><td>nat</td><td>The amount of tokens to be transferred</td></tr><tr><td>token</td><td>tokenType: <br>| unit Mav <br>| (address tokenContractAddress) Fa12 <br>| (address tokenContractAddress, nat tokenId)  Fa2</td><td>The token type of the token to be transferred, corresponding to either Mav, MRC-10, or MRC-20</td></tr></tbody></table>

#### setLambda

`function setLambda(string lambdaName, bytes func_bytes)`

Sets a lambda in the Aggregator contract with the given bytes and name

{% hint style="info" %}
Can be called only by the admin (i.e. the governance proxy contract)
{% endhint %}

<table><thead><tr><th width="249.33333333333331">Param Name</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td>lambdaName</td><td>string</td><td>The name of the lambda to be set</td></tr><tr><td>func_bytes</td><td>bytes</td><td>The data of the lambda in Michelson bytes format</td></tr></tbody></table>

#### setProductLambda

`function setProductLambda(string lambdaName, bytes func_bytes)`

Sets a lambda in the aggregator lambda ledger with the given bytes and name

{% hint style="info" %}
Can be called only by the admin (i.e. the governance proxy contract)
{% endhint %}

<table><thead><tr><th width="249.33333333333331">Param Name</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td>lambdaName</td><td>string</td><td>The name of the lambda to be set</td></tr><tr><td>func_bytes</td><td>bytes</td><td>The data of the lambda in Michelson bytes format</td></tr></tbody></table>

### BreakGlass **Entrypoints**

#### pauseAll

`function pauseAll()`

Pauses all entrypoints in the aggregator factory contract, and also calls the pauseAll entrypoint in each tracked aggregator contract

{% hint style="info" %}
Can be called only by the admin or the governance contract address
{% endhint %}

#### unpauseAll

`function unpauseAll()`

Unpauses all entrypoints in the aggregator factory contract, and also calls the unpauseAll entrypoint in each tracked aggregator contract

{% hint style="info" %}
Can be called only by the admin or the governance contract address
{% endhint %}

#### togglePauseEntrypoint

`function togglePauseEntrypoint(aggregatorFactoryPausableEntrypointType targetEntrypoint, unit empty)`

Toggles the pausing of a specific entrypoint in the contract

{% hint style="info" %}
Can be called only by the admin (i.e. the governance proxy contract)
{% endhint %}

<table><thead><tr><th width="177.33333333333331">Param Name</th><th width="347">Type</th><th>Description</th></tr></thead><tbody><tr><td>targetEntrypoint</td><td>aggregatorFactoryPausableEntrypointType: <br>| bool CreateAggregator<br>| bool UntrackAggregator<br>| bool TrackAggregator<br>| bool DistributeRewardXtz<br>| bool DistributeRewardStakedMvn</td><td>The target entrypoint to be paused, and its corresponding pause boolean. If the boolean is set to True, the entrypoint will be paused. </td></tr><tr><td>empty</td><td>unit</td><td>A null param used to prettify interactions with this entrypoint on blockchain explorers such as better-call-dev</td></tr></tbody></table>

### View Methods

#### getAdmin

`function getAdmin()`

Returns the contract admin

#### getGovernanceAddress

`function getGovernanceAddress()`

Returns the contract governance address

#### getConfig

`function getConfig()`

Returns the contract configuration parameters

#### getBreakGlassConfig

`function getBreakGlassConfig()`

Returns the contract configuration parameters

#### getWhitelistContractOpt

`function getWhitelistContractOpt(address contractAddress)`

Returns unit if contract address is whitelisted, else returns none

#### checkAggregatorExists

`function checkAggregatorExists(address aggregatorContractAddress)`

Returns True if the aggregator contract address is found in the trackedAggregators set&#x20;

#### getTrackedAggregators

`function getTrackedAggregators()`

Returns the trackedAggregators set&#x20;

#### getLambdaOpt

`function getLambdaOpt(string lambdaName)`

Returns a lambda in the contract for the given lambda name, else returns none

#### getAggregatorLambdaOpt

`function getAggregatorLambdaOpt(string lambdaName)`

Returns a lambda in the aggregator lambda ledger for the given lambda name, else returns none
