# LogarithmOracle

**Inherits:** UUPSUpgradeable, Ownable2StepUpgradeable, IOracle\
\
**Author:** Logarithm Labs

The LogarithmOracle is a price oracle contract that provides price feeds for various assets using Chainlink price feeds. It implements the UUPS upgradeable pattern and includes ownership controls. The contract serves as a centralized price oracle that manages price feeds for different assets, handles price feed heartbeat monitoring, provides price conversion between different assets, and maintains asset decimal information.

### State Variables

#### LogarithmOracleStorageLocation

```solidity
bytes32 private constant LogarithmOracleStorageLocation =
    0x2c93e30cf348944d3203d68cfbfc99aa913023170c5de2049def7c26b25c6400;
```

### Functions

#### \_getLogarithmOracleStorage

```solidity
function _getLogarithmOracleStorage() private pure returns (LogarithmOracleStorage storage $)
```

#### initialize

```solidity
function initialize(address owner_) external initializer
```

#### setPriceFeeds

Updates price feeds for multiple assets.

```solidity
function setPriceFeeds(address[] calldata assets, address[] calldata feeds) external onlyOwner
```

#### setAssetDecimals

Sets decimals of non-existing assets on this chain.

```solidity
function setAssetDecimals(address[] calldata assets, uint8[] calldata decimals) external onlyOwner
```

#### setHeartbeats

Configures heartbeat durations for price feeds.

```solidity
function setHeartbeats(address[] calldata feeds, uint256[] calldata heartbeats) external onlyOwner
```

#### getPriceFeed

Returns the price feed address for an asset.

```solidity
function getPriceFeed(address asset) external view returns (address)
```

#### getAssetPrice

Returns the normalized price of an asset (30 decimals).

```solidity
function getAssetPrice(address asset) public view override returns (uint256)
```

#### convertTokenAmount

Converts amount between different assets.

```solidity
function convertTokenAmount(address from, address to, uint256 amount) external view returns (uint256)
```

#### assetDecimals

Returns the decimal places for an asset.

```solidity
function assetDecimals(address asset) public view returns (uint8)
```

#### \_setAssetDecimal

Internal function to set asset decimals.

```solidity
function _setAssetDecimal(address asset, uint8 decimal) internal
```

### Events

#### PriceFeedUpdated

Emitted when a price feed is updated.

```solidity
event PriceFeedUpdated(address asset, address feed)
```

#### HeartBeatUpdated

Emitted when a heartbeat duration is updated.

```solidity
event HeartBeatUpdated(address asset, uint256 heartbeatDuration)
```

#### AssetDecimalInitiated

Emitted when asset decimals are set.

```solidity
event AssetDecimalInitiated(address asset, uint8 decimals)
```

### Structs

#### LogarithmOracleStorage

```solidity
struct LogarithmOracleStorage {
    mapping(address asset => IPriceFeed) priceFeeds;
    mapping(address priceFeed => uint256) heartbeatDurations;
    mapping(address asset => uint8) decimals;
}
```
