# ExchangeRateFeeder

The ExchangeRateFeeder contract is responsible for calculating and determining the exchange rate between an Ethereum stablecoin and their aTerra counterpart.&#x20;

## Events

### `RateUpdated`

Emitted when exchange rate is updated.

```
event RateUpdated(
    address indexed _operator,
    address indexed _token,
    uint256 _before,
    uint256 _after,
    uint256 _updateCount
);
```

| Key            | Type    | Description                                                    |
| -------------- | ------- | -------------------------------------------------------------- |
| `_operator`    | address | Address that updated the exchange rate                         |
| `_token`       | address | Address of token that had its exchange rate updated            |
| `_before`      | uint256 | Exchange rate value pre-update                                 |
| `_after`       | uint256 | Exchange rate value post-update                                |
| `_updateCount` | uint256 | Number of times that interest was compounded during the update |

## State

### `Status`

Represents the exchange rate updatability for a stablecoin.

```
enum Status {NEUTRAL, RUNNING, STOPPED}
```

| Key       | Description                                                   |
| --------- | ------------------------------------------------------------- |
| `NEUTRAL` | Set when a stablecoin was first added                         |
| `RUNNING` | Exchange rate of stablecoin available for updates             |
| `STOPPED` | Set when exchange rate updates for this stablecoin is stopped |

### `Token`

Represents information for an aTerra token.

```
struct Token {
    Status status;
    uint256 exchangeRate;
    uint256 period;
    uint256 weight;
    uint256 lastUpdatedAt;
}
```

| Key            | Type    | Description                                                |
| -------------- | ------- | ---------------------------------------------------------- |
| `status`       | Status  | Exchange rate updatability status                          |
| `exchangeRate` | uint256 | Exchange rate when the exchange rate was last updated.     |
| `period`       | uint256 | Minimum time period required between exchange rate updates |
| `weight`       | uint256 | Interest rate per `period` of time                         |
| `lastUpdated`  | uint256 | Block timestamp when exchange rate was last updated        |

## Functions

### `exchangeRateOf`

Gets the exchange rate for the specified aTerra token. Returns a simulated value (reflects yield accrued since last exchange rate update) if `_simulate` is set as `true`. Returns the last updated exchange rate value is `_simulate` is set as `false`.

```
function exchangeRateOf(
    address _token, 
    bool _simulate
) external view returns (uint256);
```

| Key         | Type    | Description                                             |
| ----------- | ------- | ------------------------------------------------------- |
| `_token`    | address | Address of aTerra token to retrieve exchange rate       |
| `_simulate` | bool    | Indicator on whether to return a interest-accrued value |

### `update`

Updates the exchange rate for specified aTerra token.

```
function update(address _token) external;
```

| Key      | Type    | Description                                     |
| -------- | ------- | ----------------------------------------------- |
| `_token` | address | Address of aTerra token to update exchange rate |


---

# 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.anchorprotocol.com/anchor-2/ethanchor/ethanchor-contracts/exchangeratefeeder.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.
