Proof of Reserve Feeds
Chainlink Proof of Reserve Feeds provide the status of the reserves for several assets. You can consume these feeds the same way as Price Feeds.
To find a list of available Proof of Reserve Feeds, see the Contract Addresses page.
Types of Proof of Reserve Feeds
Reserves are available for both cross-chain assets and off-chain assets. Token issuers prove the reserves for their assets through several different methods:
- Cross-chain reserves:
- Wallet address manager
- Self-attested wallet API
- Off-chain reserves:
- Third-party API
- Custodian API
- Self-attested API
Cross-chain reserves
Cross-Chain reserves are sourced from the network where the reserves are held. This includes but is not limited to networks including Bitcoin, Filecoin, Cardano, and chains where Chainlink has a native integration. Chainlink Node operators can report cross-chain reserves by running an external adapter and querying the source-chain client directly. In some instances, the reserves are composed of a dynamic list of IDs or addresses using a composite adapter.
Cross-chain reserves provide their data using the following methods:
- Wallet address manager: The project uses the IPoRAddressList wallet address manager contract and self-attests to which addresses they own.
- Self-attested wallet API: The project attests which addresses they own through a self-hosted API.
Off-chain reserves
Off-Chain reserves are sourced from APIs through an external adapter.
Off-chain reserves provide their data using the following methods:
- Third-party API: An auditor or a third-party verifies the reserves and provides that data through an API.
- Custodian API: Reserve status is read directly from a bank or custodian API.
- Self-attested API: Reserve status is read from an API that the token issuer hosts.
Using Proof of Reserve Feeds
Read answers from Proof of Reserve Feeds the same way that you use Price Feeds.
Using Solidity, your smart contract should reference AggregatorV3Interface
, which defines the external functions implemented by Data Feeds.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
contract ReserveConsumerV3 {
AggregatorV3Interface internal reserveFeed;
/**
* Network: Ethereum Mainnet
* Aggregator: WBTC PoR
* Address: 0xa81FE04086865e63E12dD3776978E49DEEa2ea4e
*/
constructor() {
reserveFeed = AggregatorV3Interface(
0xa81FE04086865e63E12dD3776978E49DEEa2ea4e
);
}
/**
* Returns the latest price
*/
function getLatestReserve() public view returns (int) {
// prettier-ignore
(
/*uint80 roundID*/,
int reserve,
/*uint startedAt*/,
/*uint timeStamp*/,
/*uint80 answeredInRound*/
) = reserveFeed.latestRoundData();
return reserve;
}
}