Contract 0xa9a53ff468a502dc63fd54ab040fc84506d54094

Contract Overview

Balance:
0 DEV
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xcfa6eb16d96be986f32420fb7ab9496a95014264ba6498b778957435431179e8Set Asset Feed28053312022-09-09 4:45:42268 days 4 hrs ago0xb6ca26b953a0c5bf5180efb57e7685668a4a6a18 IN 0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV0.003260756
0xaa12c842bedcf6d1481dff56651b3f2660c9e6560ef6c099609cec6a3b569fb5Set Asset Feed28053202022-09-09 4:42:36268 days 4 hrs ago0xb6ca26b953a0c5bf5180efb57e7685668a4a6a18 IN 0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV0.003260756
0x471e87176ce7b44444686d01bcf6bc48b373025cfbad67ec9535201c54c96011Set Asset Feed28053082022-09-09 4:39:30268 days 4 hrs ago0xb6ca26b953a0c5bf5180efb57e7685668a4a6a18 IN 0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV0.003260756
0xc856d4cf6be2ba2484892d1aa5f616cf96871bd705af5b88635075e6c1b2c800Set Asset Feed28052962022-09-09 4:36:30268 days 5 hrs ago0xb6ca26b953a0c5bf5180efb57e7685668a4a6a18 IN 0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV0.003260756
0x4ef94f605f8c1576cdaf91dbb941c7a3869c612f6f6d54e4bc050077f62725f4Set Asset Feed28052842022-09-09 4:33:42268 days 5 hrs ago0xb6ca26b953a0c5bf5180efb57e7685668a4a6a18 IN 0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV0.003260756
0x5f73da0860dd6cda56742d4fc13ee6d3b858847a8258aec339a4813fe1c116bfSet Asset Feed28052702022-09-09 4:30:48268 days 5 hrs ago0xb6ca26b953a0c5bf5180efb57e7685668a4a6a18 IN 0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV0.003260756
0xbabfa06457719beb3d833ec30729c022b91c4e87ac2dae63d610a9439640825bSet Asset Feed28052562022-09-09 4:28:00268 days 5 hrs ago0xb6ca26b953a0c5bf5180efb57e7685668a4a6a18 IN 0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV0.003260756
0xb013eda849f6658271a9b52a6a29a7b2e24d0d978f6f1c239bfb976223250cd2Set Asset Feed28052372022-09-09 4:23:24268 days 5 hrs ago0xb6ca26b953a0c5bf5180efb57e7685668a4a6a18 IN 0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV0.003260756
0x2e195f812adc5ef92d4e0ac3d59e0731024b0aa968e55c0627827f2b5159d4faSet Asset Feed28052222022-09-09 4:19:54268 days 5 hrs ago0xb6ca26b953a0c5bf5180efb57e7685668a4a6a18 IN 0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV0.003260756
0x7e55d6a2221a46a9665ede57a1f59114e606e62fd78cdd67b9fc21bcfceac39eSet Asset Feed28052092022-09-09 4:16:24268 days 5 hrs ago0xb6ca26b953a0c5bf5180efb57e7685668a4a6a18 IN 0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV0.003260756
0xa3f5981ee7cc2bcf9f0a2db2ecb48eedb9fa6c0c20948c6d4ed45c5be26d3f4aSet Asset Feed28051962022-09-09 4:13:30268 days 5 hrs ago0xb6ca26b953a0c5bf5180efb57e7685668a4a6a18 IN 0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV0.003260756
0x691203f0cdeadf24c9e2fe74a9e4be32d364d877454eb013e9ef13b6bf1f2bf5Set Asset Feed28051832022-09-09 4:10:30268 days 5 hrs ago0xb6ca26b953a0c5bf5180efb57e7685668a4a6a18 IN 0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV0.003260756
0xe5c92a5981b2e1124c12056f37c44cd7b373f1fb997a921a0cb89bdaf4cd7e83Set Asset Feed28051702022-09-09 4:07:36268 days 5 hrs ago0xb6ca26b953a0c5bf5180efb57e7685668a4a6a18 IN 0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV0.003260756
0x995fdfb4ffdb7b1d11bcf9518d2ff0d10f753635de2d4e3a21c0ced7396d3f5bSet Asset Feed28051602022-09-09 4:05:00268 days 5 hrs ago0xb6ca26b953a0c5bf5180efb57e7685668a4a6a18 IN 0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV0.003260756
0x070e1ff3def5761508dd0b08d27d59ad6e45ee0786f4708bf284f46e0e8647aeSet Asset Feed28051472022-09-09 4:01:36268 days 5 hrs ago0xb6ca26b953a0c5bf5180efb57e7685668a4a6a18 IN 0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV0.003260756
0xcb7761f3ea4167e48ad7273d0e6eb67ee8bf86da35b4e2e7b35e91e641269bf2Set Asset Feed28051352022-09-09 3:58:42268 days 5 hrs ago0xb6ca26b953a0c5bf5180efb57e7685668a4a6a18 IN 0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV0.003244676
0xdbff150f95f9f0c35511a6019d5417fe140dddb0b44b6a269921c869e5c5413eSet Asset Feed28051142022-09-09 3:53:54268 days 5 hrs ago0xb6ca26b953a0c5bf5180efb57e7685668a4a6a18 IN 0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV0.003260756
0x8fb5044bf651d34e940dc1d8137224fb9b2fd9284663b3dd745b9973ef670a11Set Asset Feed28051012022-09-09 3:51:06268 days 5 hrs ago0xb6ca26b953a0c5bf5180efb57e7685668a4a6a18 IN 0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV0.003260756
0x5eefa4571d670a4acab7c6b9de5df824612cdd745bf7a23ab1c8fdaf75f4be22Set Asset Feed28050872022-09-09 3:47:54268 days 5 hrs ago0xb6ca26b953a0c5bf5180efb57e7685668a4a6a18 IN 0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV0.003260756
0x1df0b83828d24fb827d919a7305b2d9f29f10d2b676350c1289b40468a1ea707Set Asset Feed28050752022-09-09 3:45:12268 days 5 hrs ago0xb6ca26b953a0c5bf5180efb57e7685668a4a6a18 IN 0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV0.003260756
0x33ff9c849333c610d1eb4fb2071d9b546f2b0256fcbd5277bbe91810e9d59f95Set Asset Feed28050612022-09-09 3:42:18268 days 5 hrs ago0xb6ca26b953a0c5bf5180efb57e7685668a4a6a18 IN 0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV0.003260756
0x62920967fcea20b433e9a15a5a7046d17f2e55287704bbd9d3558e985bf63769Set Asset Feed28050482022-09-09 3:39:00268 days 5 hrs ago0xb6ca26b953a0c5bf5180efb57e7685668a4a6a18 IN 0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV0.003260756
0x8ce1aaccc0d6f2b8ea659ea858e4e61b1c850f56dd0e45a696d8db4774b9115fSet Asset Feed28050342022-09-09 3:35:42268 days 6 hrs ago0xb6ca26b953a0c5bf5180efb57e7685668a4a6a18 IN 0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV0.003260756
0x4a32446d448f2cfb0922f478fe52a373821baf9a6db3f09adaaa14d97765578dSet Asset Feed28050242022-09-09 3:33:12268 days 6 hrs ago0xb6ca26b953a0c5bf5180efb57e7685668a4a6a18 IN 0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV0.003260756
0x152657d0b699b9d2c474262bd59f6c57f6cca00a82ad375eb511871d0abbb4c6Set Asset Feed28050102022-09-09 3:29:36268 days 6 hrs ago0xb6ca26b953a0c5bf5180efb57e7685668a4a6a18 IN 0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV0.003260756
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xf64f5ddfb56204d014434204bbed6e06e09040fe3fabeb56c628ce008693f8d528673622022-09-19 21:09:54257 days 12 hrs ago 0xa9a53ff468a502dc63fd54ab040fc84506d540940x8c1a8c1f8fdbefa96b2a86ad3b2fed692c3b1ce80 DEV
0xf64f5ddfb56204d014434204bbed6e06e09040fe3fabeb56c628ce008693f8d528673622022-09-19 21:09:54257 days 12 hrs ago 0xa9a53ff468a502dc63fd54ab040fc84506d540940x8c1a8c1f8fdbefa96b2a86ad3b2fed692c3b1ce80 DEV
0xf64f5ddfb56204d014434204bbed6e06e09040fe3fabeb56c628ce008693f8d528673622022-09-19 21:09:54257 days 12 hrs ago 0x56287db6a23acb19c948d77199d4fe9cc8bb152d0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV
0xa14b3b24ec7b2a19d8039606a7e31410c885069c9e08c65272851b721efae69628669552022-09-19 19:31:42257 days 14 hrs ago 0xa9a53ff468a502dc63fd54ab040fc84506d54094 0x326fafb9e9b5188d7c2e95c0d782ecb19e5efdf90 DEV
0xa14b3b24ec7b2a19d8039606a7e31410c885069c9e08c65272851b721efae69628669552022-09-19 19:31:42257 days 14 hrs ago 0xa9a53ff468a502dc63fd54ab040fc84506d54094 0x326fafb9e9b5188d7c2e95c0d782ecb19e5efdf90 DEV
0xa14b3b24ec7b2a19d8039606a7e31410c885069c9e08c65272851b721efae69628669552022-09-19 19:31:42257 days 14 hrs ago 0x56287db6a23acb19c948d77199d4fe9cc8bb152d0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV
0x914543614e566b3731a88521e3c6d24f9095260200c408a9bc85799cab31c6f628666592022-09-19 18:19:30257 days 15 hrs ago 0xa9a53ff468a502dc63fd54ab040fc84506d540940x141ec95db9298cb4bb20cbac422a42a047a764b10 DEV
0x914543614e566b3731a88521e3c6d24f9095260200c408a9bc85799cab31c6f628666592022-09-19 18:19:30257 days 15 hrs ago 0xa9a53ff468a502dc63fd54ab040fc84506d540940x141ec95db9298cb4bb20cbac422a42a047a764b10 DEV
0x914543614e566b3731a88521e3c6d24f9095260200c408a9bc85799cab31c6f628666592022-09-19 18:19:30257 days 15 hrs ago 0x56287db6a23acb19c948d77199d4fe9cc8bb152d0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV
0x914543614e566b3731a88521e3c6d24f9095260200c408a9bc85799cab31c6f628666592022-09-19 18:19:30257 days 15 hrs ago 0xa9a53ff468a502dc63fd54ab040fc84506d540940x8c1a8c1f8fdbefa96b2a86ad3b2fed692c3b1ce80 DEV
0x914543614e566b3731a88521e3c6d24f9095260200c408a9bc85799cab31c6f628666592022-09-19 18:19:30257 days 15 hrs ago 0xa9a53ff468a502dc63fd54ab040fc84506d540940x8c1a8c1f8fdbefa96b2a86ad3b2fed692c3b1ce80 DEV
0x914543614e566b3731a88521e3c6d24f9095260200c408a9bc85799cab31c6f628666592022-09-19 18:19:30257 days 15 hrs ago 0x56287db6a23acb19c948d77199d4fe9cc8bb152d0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV
0x914543614e566b3731a88521e3c6d24f9095260200c408a9bc85799cab31c6f628666592022-09-19 18:19:30257 days 15 hrs ago 0xa9a53ff468a502dc63fd54ab040fc84506d540940x141ec95db9298cb4bb20cbac422a42a047a764b10 DEV
0x914543614e566b3731a88521e3c6d24f9095260200c408a9bc85799cab31c6f628666592022-09-19 18:19:30257 days 15 hrs ago 0xa9a53ff468a502dc63fd54ab040fc84506d540940x141ec95db9298cb4bb20cbac422a42a047a764b10 DEV
0x914543614e566b3731a88521e3c6d24f9095260200c408a9bc85799cab31c6f628666592022-09-19 18:19:30257 days 15 hrs ago 0x56287db6a23acb19c948d77199d4fe9cc8bb152d0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV
0x914543614e566b3731a88521e3c6d24f9095260200c408a9bc85799cab31c6f628666592022-09-19 18:19:30257 days 15 hrs ago 0xa9a53ff468a502dc63fd54ab040fc84506d540940x8c1a8c1f8fdbefa96b2a86ad3b2fed692c3b1ce80 DEV
0x914543614e566b3731a88521e3c6d24f9095260200c408a9bc85799cab31c6f628666592022-09-19 18:19:30257 days 15 hrs ago 0xa9a53ff468a502dc63fd54ab040fc84506d540940x8c1a8c1f8fdbefa96b2a86ad3b2fed692c3b1ce80 DEV
0x914543614e566b3731a88521e3c6d24f9095260200c408a9bc85799cab31c6f628666592022-09-19 18:19:30257 days 15 hrs ago 0x56287db6a23acb19c948d77199d4fe9cc8bb152d0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV
0xa1d5e237e921ee42c7016544997977a27c54c219dfa0147b2f4285d3d03effcc28665832022-09-19 18:02:18257 days 15 hrs ago 0xa9a53ff468a502dc63fd54ab040fc84506d54094 0xcf88a8d7fc1a687895fc8ffaad567f303926b0940 DEV
0xa1d5e237e921ee42c7016544997977a27c54c219dfa0147b2f4285d3d03effcc28665832022-09-19 18:02:18257 days 15 hrs ago 0xa9a53ff468a502dc63fd54ab040fc84506d54094 0xcf88a8d7fc1a687895fc8ffaad567f303926b0940 DEV
0xa1d5e237e921ee42c7016544997977a27c54c219dfa0147b2f4285d3d03effcc28665832022-09-19 18:02:18257 days 15 hrs ago 0x56287db6a23acb19c948d77199d4fe9cc8bb152d0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV
0xa1d5e237e921ee42c7016544997977a27c54c219dfa0147b2f4285d3d03effcc28665832022-09-19 18:02:18257 days 15 hrs ago 0xa9a53ff468a502dc63fd54ab040fc84506d540940xcb1c08b86c6eac617b1bed5d1e9cd7fd308fda4d0 DEV
0xa1d5e237e921ee42c7016544997977a27c54c219dfa0147b2f4285d3d03effcc28665832022-09-19 18:02:18257 days 15 hrs ago 0xa9a53ff468a502dc63fd54ab040fc84506d540940xcb1c08b86c6eac617b1bed5d1e9cd7fd308fda4d0 DEV
0xa1d5e237e921ee42c7016544997977a27c54c219dfa0147b2f4285d3d03effcc28665832022-09-19 18:02:18257 days 15 hrs ago 0x56287db6a23acb19c948d77199d4fe9cc8bb152d0xa9a53ff468a502dc63fd54ab040fc84506d540940 DEV
0xa1d5e237e921ee42c7016544997977a27c54c219dfa0147b2f4285d3d03effcc28665832022-09-19 18:02:18257 days 15 hrs ago 0xa9a53ff468a502dc63fd54ab040fc84506d54094 0xa873f6b30ad79fcaf9b03a0a883d6d1f18d661d70 DEV
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ChainlinkFeedGetter

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 6 : ChainlinkFeedGetter.sol
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.4;

import "../oracle/interfaces/IPrimeOracle.sol";
import "../oracle/interfaces/IPrimeOracleGetter.sol";
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
import "../../util/CommonErrors.sol";

contract ChainlinkFeedGetter is IPrimeOracleGetter, CommonErrors {

    // Map of asset price feeds (asset => priceSource)
    mapping(uint256 => mapping(address => AggregatorV3Interface)) private assetFeeds;

    //TODO: allow transfer of admin
    address public admin;

    uint8 public constant RATIO_DECIMALS = 18;

    /**
    * @dev Only the admin can call functions marked by this modifier.
    **/
    modifier onlyAdmin {
        if(msg.sender != admin) revert OnlyAdmin();
        _;
    }

    constructor() {
        admin = msg.sender;
    }

    /// @inheritdoc IPrimeOracleGetter

    function getAssetPrice(
        uint256 chainId,
        address asset,
        address /* denomToken */
    ) external view override returns (uint256 price, uint8 decimals) {
        AggregatorV3Interface feed = assetFeeds[chainId][asset];
        if (address(feed) != address(0)) {
            (
                /* uint80 roundId */,
                int256 answer,
                /* uint256 startedAt */,
                /* uint256 updatedAt */,
                /* uint80 answeredInRound */
            ) = feed.latestRoundData();

            if (answer < 0) return (0,0);

            price = uint256(answer);
            decimals = feed.decimals();
        }
    }

    function getAssetRatio(
        address overlyingAsset,
        address underlyingAsset,
        uint256 underlyingChainId
    ) external view override returns (uint256 ratio, uint8 decimals) {
        AggregatorV3Interface numFeed = assetFeeds[block.chainid][overlyingAsset];
        AggregatorV3Interface denFeed = assetFeeds[underlyingChainId][underlyingAsset];

        if (address(numFeed) != address(0) && address(denFeed) != address(0)) {
            (
                /* uint80 roundId */,
                int256 numAnswer,
                /* uint256 startedAt */,
                /* uint256 updatedAt */,
                /* uint80 answeredInRound */
            ) = numFeed.latestRoundData();

            (
                /* uint80 roundId */,
                int256 denAnswer,
                /* uint256 startedAt */,
                /* uint256 updatedAt */,
                /* uint80 answeredInRound */
            ) = denFeed.latestRoundData();

            if (numAnswer >= 0 && denAnswer >= 0) {
                ratio = uint256(numAnswer) * 10**(denFeed.decimals() + RATIO_DECIMALS) / uint256(denAnswer) / 10**numFeed.decimals();
                decimals = RATIO_DECIMALS;
            }
        }
    }

    function getPriceDecimals(uint256 chainId, address asset) external view override returns (uint256) {
        if (asset == address(0)) revert AddressExpected();

        AggregatorV3Interface feed = assetFeeds[chainId][asset];
        if (address(feed) != address(0)) {
            return feed.decimals();
        }
        return 0;
    }

    function _getAssetFeed(uint256 chainId, address asset) internal view returns (address) {
        if (asset == address(0)) revert AddressExpected();

        return address(assetFeeds[chainId][asset]);
    }

    function getAssetFeed(uint256 chainId, address asset) external view override returns (address) {
        if (asset == address(0)) revert AddressExpected();

        return _getAssetFeed(chainId, asset);
    }

    /// @inheritdoc IPrimeOracleGetter
    function setAssetFeed(
        uint256 chainId,
        address asset,
        address feed
    ) external override onlyAdmin() {
        assetFeeds[chainId][asset] = AggregatorV3Interface(feed);
        emit AssetFeedUpdated(chainId, asset, feed);
    }

}

File 2 of 6 : IPrimeOracle.sol
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.4;

import "./IPrimeOracleGetter.sol";
import "./PrimeOracleStorage.sol";

/**
 * @title IPrimeOracle
 * @author Prime
 * @notice The core interface for the Prime Oracle
 */
abstract contract IPrimeOracle is PrimeOracleStorage {

    /**
     * @dev Emitted after the price data feed of an asset is set/updated
     * @param asset The address of the asset
     * @param chainId The chainId of the asset
     * @param feed The price feed of the asset
     */
    event SetPrimaryFeed(uint256 chainId, address indexed asset, address indexed feed);

    /**
     * @dev Emitted after the price data feed of an asset is set/updated
     * @param asset The address of the asset
     * @param feed The price feed of the asset
     */
    event SetSecondaryFeed(uint256 chainId, address indexed asset, address indexed feed);

    /**
     * @dev Emitted after the exchange rate data feed of a loan market asset is set/updated
     * @param asset The address of the asset
     * @param chainId The chainId of the asset
     * @param feed The price feed of the asset
     */
    event SetExchangRatePrimaryFeed(uint256 chainId, address indexed asset, address indexed feed);

    /**
     * @dev Emitted after the exchange rate data feed of a loan market asset is set/updated
     * @param asset The address of the asset
     * @param feed The price feed of the asset
     */
    event SetExchangeRateSecondaryFeed(uint256 chainId, address indexed asset, address indexed feed);

    /**
     * @notice Get the underlying price of a cToken asset
     * @param collateralMarketUnderlying The PToken collateral to get the sasset price of
     * @param chainId the chainId to get an asset price for
     * @return The underlying asset price.
     *  Zero means the price is unavailable.
     */
    function getUnderlyingPrice(uint256 chainId, address collateralMarketUnderlying) external view virtual returns (uint256, uint8);

    /**
     * @notice Get the underlying borrow price of loanMarketAsset
     * @return The underlying borrow price
     *  Zero means the price is unavailable.
     */
    function getUnderlyingPriceBorrow(
        uint256 chainId,
        address loanMarketUnderlying
    ) external view virtual returns (uint256, uint8);

    /**
     * @notice Get the exchange rate of loanMarketAsset to basis
     * @return The underlying exchange rate of loanMarketAsset to basis
     *  Zero means the price is unavailable.
     */
    function getBorrowAssetExchangeRate(
        address loanMarketOverlying,
        uint256 loanMarketUnderlyingChainId,
        address loanMarketUnderlying
    ) external view virtual returns (uint256 /* ratio */, uint8 /* decimals */);

    /*** Admin Functions ***/

    /**
     * @notice Sets or replaces price feeds of assets
     * @param asset The addresses of the assets
     * @param feed The addresses of the price feeds
     */
    function setPrimaryFeed(uint256 chainId, address asset, IPrimeOracleGetter feed) external virtual;

    /**
     * @notice Sets or replaces price feeds of assets
     * @param asset The addresses of the assets
     * @param feed The addresses of the price feeds
     */
    function setSecondaryFeed(uint256 chainId, address asset, IPrimeOracleGetter feed) external virtual;
}

File 3 of 6 : IPrimeOracleGetter.sol
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.4;

/**
 * @title IPrimeOracleGetter
 * @author Prime
 * @notice Interface for the Prime price oracle.
 **/
interface IPrimeOracleGetter {

    /**
     * @dev Emitted after the price data feed of an asset is updated
     * @param asset The address of the asset
     * @param feed The price feed of the asset
     */
    event AssetFeedUpdated(uint256 chainId, address indexed asset, address indexed feed);

    /**
     * @notice Gets the price feed of an asset
     * @param asset The addresses of the asset
     * @return address of asset feed
     */
    function getAssetFeed(uint256 chainId, address asset) external view returns (address);

    /**
     * @notice Sets or replaces price feeds of assets
     * @param asset The addresses of the assets
     * @param feed The addresses of the price feeds
     */
    function setAssetFeed(uint256 chainId, address asset, address feed) external;

    /**
     * @notice Returns the price data in the denom currency
     * @param quoteToken A token to return price data for
     * @param denomToken A token to price quoteToken against
     * @param price of the asset from the oracle
     * @param decimals of the asset from the oracle
     **/
    function getAssetPrice(
        uint256 chainId,
        address quoteToken,
        address denomToken
    ) external view returns (uint256 price, uint8 decimals);

    function getAssetRatio(
        address overlyingAsset,
        address underlyingAsset,
        uint256 underlyingChainId
    ) external view returns (uint256 ratio, uint8 decimals);

    /**
     * @notice Returns the price data in the denom currency
     * @param quoteToken A token to return price data for
     * @return return price of the asset from the oracle
     **/
    function getPriceDecimals(
        uint256 chainId,
        address quoteToken
    ) external view returns (uint256);

}

File 4 of 6 : AggregatorV3Interface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface AggregatorV3Interface {
  function decimals() external view returns (uint8);

  function description() external view returns (string memory);

  function version() external view returns (uint256);

  // getRoundData and latestRoundData should both raise "No data present"
  // if they do not have data to report, instead of returning unset values
  // which could be misinterpreted as actual reported values.
  function getRoundData(uint80 _roundId)
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );

  function latestRoundData()
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );
}

File 5 of 6 : CommonErrors.sol
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.4;

abstract contract CommonErrors {
    error AccountNoAssets(address account);
    error AddressExpected();
    error AlreadyInitialized();
    error EccMessageAlreadyProcessed();
    error EccFailedToValidate();
    error ExpectedMintAmount();
    error ExpectedBridgeAmount();
    error ExpectedBorrowAmount();
    error ExpectedWithdrawAmount();
    error ExpectedRepayAmount();
    error ExpectedTradeAmount();
    error ExpectedDepositAmount();
    error ExpectedTransferAmount();
    error InsufficientReserves();
    error InvalidPayload();
    error InvalidPrice();
    error InvalidPrecision();
    error InvalidSelector();
    error MarketExists();
    error LoanMarketIsListed(bool status);
    error MarketIsPaused();
    error MarketNotListed();
    error MsgDataExpected();
    error NameExpected();
    error NothingToWithdraw();
    error NotInMarket(uint256 chainId, address token);
    error OnlyAdmin();
    error OnlyAuth();
    error OnlyGateway();
    error OnlyMiddleLayer();
    error OnlyMintAuth();
    error OnlyRoute();
    error OnlyRouter();
    error OnlyMasterState();
    error ParamOutOfBounds();
    error RouteExists();
    error Reentrancy();
    error EnterLoanMarketFailed();
    error EnterCollMarketFailed();
    error ExitLoanMarketFailed();
    error ExitCollMarketFailed();
    error RepayTooMuch(uint256 repayAmount, uint256 maxAmount);
    error WithdrawTooMuch();
    error NotEnoughBalance(address token, address who);
    error LiquidateDisallowed();
    error SeizeTooMuch();
    error SymbolExpected();
    error RouteNotSupported(address route);
    error MiddleLayerPaused();
    error PairNotSupported(address loanAsset, address tradeAsset);
    error TransferFailed(address from, address dest);
    error TransferPaused();
    error UnknownRevert();
    error UnexpectedValueDelta();
    error ExpectedValue();
    error UnexpectedDelta();
}

File 6 of 6 : PrimeOracleStorage.sol
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.4;

import "./IPrimeOracleGetter.sol";

/**
 * @title PrimeOracleStorage
 * @author Prime
 * @notice The core interface for the Prime Oracle storage variables
 */
abstract contract PrimeOracleStorage {
    address public pusdAddress;
    //TODO: allow transfer of ownership
    address public admin;
    // Map of asset price feeds (chainasset => priceSource)
    mapping(uint256 => mapping(address => IPrimeOracleGetter)) public primaryFeeds;
    mapping(uint256 => mapping(address => IPrimeOracleGetter)) public secondaryFeeds;
    mapping(uint256 => mapping(address => IPrimeOracleGetter)) public exchangeRatePrimaryFeeds;
    mapping(uint256 => mapping(address => IPrimeOracleGetter)) public exchangeRateSecondaryFeeds;
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AccountNoAssets","type":"error"},{"inputs":[],"name":"AddressExpected","type":"error"},{"inputs":[],"name":"AlreadyInitialized","type":"error"},{"inputs":[],"name":"EccFailedToValidate","type":"error"},{"inputs":[],"name":"EccMessageAlreadyProcessed","type":"error"},{"inputs":[],"name":"EnterCollMarketFailed","type":"error"},{"inputs":[],"name":"EnterLoanMarketFailed","type":"error"},{"inputs":[],"name":"ExitCollMarketFailed","type":"error"},{"inputs":[],"name":"ExitLoanMarketFailed","type":"error"},{"inputs":[],"name":"ExpectedBorrowAmount","type":"error"},{"inputs":[],"name":"ExpectedBridgeAmount","type":"error"},{"inputs":[],"name":"ExpectedDepositAmount","type":"error"},{"inputs":[],"name":"ExpectedMintAmount","type":"error"},{"inputs":[],"name":"ExpectedRepayAmount","type":"error"},{"inputs":[],"name":"ExpectedTradeAmount","type":"error"},{"inputs":[],"name":"ExpectedTransferAmount","type":"error"},{"inputs":[],"name":"ExpectedValue","type":"error"},{"inputs":[],"name":"ExpectedWithdrawAmount","type":"error"},{"inputs":[],"name":"InsufficientReserves","type":"error"},{"inputs":[],"name":"InvalidPayload","type":"error"},{"inputs":[],"name":"InvalidPrecision","type":"error"},{"inputs":[],"name":"InvalidPrice","type":"error"},{"inputs":[],"name":"InvalidSelector","type":"error"},{"inputs":[],"name":"LiquidateDisallowed","type":"error"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"LoanMarketIsListed","type":"error"},{"inputs":[],"name":"MarketExists","type":"error"},{"inputs":[],"name":"MarketIsPaused","type":"error"},{"inputs":[],"name":"MarketNotListed","type":"error"},{"inputs":[],"name":"MiddleLayerPaused","type":"error"},{"inputs":[],"name":"MsgDataExpected","type":"error"},{"inputs":[],"name":"NameExpected","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"who","type":"address"}],"name":"NotEnoughBalance","type":"error"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"token","type":"address"}],"name":"NotInMarket","type":"error"},{"inputs":[],"name":"NothingToWithdraw","type":"error"},{"inputs":[],"name":"OnlyAdmin","type":"error"},{"inputs":[],"name":"OnlyAuth","type":"error"},{"inputs":[],"name":"OnlyGateway","type":"error"},{"inputs":[],"name":"OnlyMasterState","type":"error"},{"inputs":[],"name":"OnlyMiddleLayer","type":"error"},{"inputs":[],"name":"OnlyMintAuth","type":"error"},{"inputs":[],"name":"OnlyRoute","type":"error"},{"inputs":[],"name":"OnlyRouter","type":"error"},{"inputs":[{"internalType":"address","name":"loanAsset","type":"address"},{"internalType":"address","name":"tradeAsset","type":"address"}],"name":"PairNotSupported","type":"error"},{"inputs":[],"name":"ParamOutOfBounds","type":"error"},{"inputs":[],"name":"Reentrancy","type":"error"},{"inputs":[{"internalType":"uint256","name":"repayAmount","type":"uint256"},{"internalType":"uint256","name":"maxAmount","type":"uint256"}],"name":"RepayTooMuch","type":"error"},{"inputs":[],"name":"RouteExists","type":"error"},{"inputs":[{"internalType":"address","name":"route","type":"address"}],"name":"RouteNotSupported","type":"error"},{"inputs":[],"name":"SeizeTooMuch","type":"error"},{"inputs":[],"name":"SymbolExpected","type":"error"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"dest","type":"address"}],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"TransferPaused","type":"error"},{"inputs":[],"name":"UnexpectedDelta","type":"error"},{"inputs":[],"name":"UnexpectedValueDelta","type":"error"},{"inputs":[],"name":"UnknownRevert","type":"error"},{"inputs":[],"name":"WithdrawTooMuch","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"chainId","type":"uint256"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":true,"internalType":"address","name":"feed","type":"address"}],"name":"AssetFeedUpdated","type":"event"},{"inputs":[],"name":"RATIO_DECIMALS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"asset","type":"address"}],"name":"getAssetFeed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"getAssetPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint8","name":"decimals","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"overlyingAsset","type":"address"},{"internalType":"address","name":"underlyingAsset","type":"address"},{"internalType":"uint256","name":"underlyingChainId","type":"uint256"}],"name":"getAssetRatio","outputs":[{"internalType":"uint256","name":"ratio","type":"uint256"},{"internalType":"uint8","name":"decimals","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"asset","type":"address"}],"name":"getPriceDecimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"feed","type":"address"}],"name":"setAssetFeed","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50600180546001600160a01b03191633179055610a21806100326000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063a83622e01161005b578063a83622e0146100d9578063c8aea946146100f3578063eaa3d1ae1461011e578063f851a4401461013f57600080fd5b806318417130146100825780637263a89a146100b157806391bba016146100c6575b600080fd5b610095610090366004610744565b610152565b6040805192835260ff9091166020830152015b60405180910390f35b6100c46100bf366004610780565b6103ed565b005b6100956100d4366004610780565b610487565b6100e1601281565b60405160ff90911681526020016100a8565b6101066101013660046107bc565b6105c3565b6040516001600160a01b0390911681526020016100a8565b61013161012c3660046107bc565b6105ff565b6040519081526020016100a8565b600154610106906001600160a01b031681565b466000908152602081815260408083206001600160a01b0380881685529083528184205485855284845282852087831686529093529083205483928216911681158015906101a857506001600160a01b03811615155b156103e3576000826001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156101e857600080fd5b505afa1580156101fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102209190610802565b5050509150506000826001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561026157600080fd5b505afa158015610275573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102999190610802565b505050915050600082121580156102b1575060008112155b156103e057836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156102ef57600080fd5b505afa158015610303573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103279190610852565b61033290600a610976565b816012856001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561036e57600080fd5b505afa158015610382573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a69190610852565b6103b09190610985565b6103bb90600a610976565b6103c590856109aa565b6103cf91906109c9565b6103d991906109c9565b9550601294505b50505b5050935093915050565b6001546001600160a01b0316331461041857604051634755657960e01b815260040160405180910390fd5b6000838152602081815260408083206001600160a01b038681168086529184529382902080546001600160a01b0319169486169485179055905186815290917fc709360c31221c0b6eec90fcfc36e335ea5ddfe4fb85722d70d0e54b12f66a32910160405180910390a3505050565b6000838152602081815260408083206001600160a01b038087168552925282205482911680156105b9576000816001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156104ec57600080fd5b505afa158015610500573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105249190610802565b5050509150506000811215610541576000809350935050506105bb565b809350816001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561057d57600080fd5b505afa158015610591573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b59190610852565b9250505b505b935093915050565b60006001600160a01b0382166105ec57604051635f3ee81760e01b815260040160405180910390fd5b6105f683836106d7565b90505b92915050565b60006001600160a01b03821661062857604051635f3ee81760e01b815260040160405180910390fd5b6000838152602081815260408083206001600160a01b0380871685529252909120541680156106cd57806001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561068a57600080fd5b505afa15801561069e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c29190610852565b60ff169150506105f9565b5060009392505050565b60006001600160a01b03821661070057604051635f3ee81760e01b815260040160405180910390fd5b506000918252602082815260408084206001600160a01b039384168552909152909120541690565b80356001600160a01b038116811461073f57600080fd5b919050565b60008060006060848603121561075957600080fd5b61076284610728565b925061077060208501610728565b9150604084013590509250925092565b60008060006060848603121561079557600080fd5b833592506107a560208501610728565b91506107b360408501610728565b90509250925092565b600080604083850312156107cf57600080fd5b823591506107df60208401610728565b90509250929050565b805169ffffffffffffffffffff8116811461073f57600080fd5b600080600080600060a0868803121561081a57600080fd5b610823866107e8565b9450602086015193506040860151925060608601519150610846608087016107e8565b90509295509295909350565b60006020828403121561086457600080fd5b815160ff8116811461087557600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156108cd5781600019048211156108b3576108b361087c565b808516156108c057918102915b93841c9390800290610897565b509250929050565b6000826108e4575060016105f9565b816108f1575060006105f9565b816001811461090757600281146109115761092d565b60019150506105f9565b60ff8411156109225761092261087c565b50506001821b6105f9565b5060208310610133831016604e8410600b8410161715610950575081810a6105f9565b61095a8383610892565b806000190482111561096e5761096e61087c565b029392505050565b60006105f660ff8416836108d5565b600060ff821660ff84168060ff038211156109a2576109a261087c565b019392505050565b60008160001904831182151516156109c4576109c461087c565b500290565b6000826109e657634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220d1380b240bd4ba76e2c1235c24732a04b3e2ae138900da43cc61ed5e40c501b164736f6c63430008090033

Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading