# Data Serivce

### APRO Oracle: Secure Off-Chain & On-Chain

APRO is building a secure platform by combining **off-chain processing** with **on-chain verification**, extending both data access and computational capabilities. This forms the foundation of **APRO Data Service**, improving data accuracy and efficiency while offering the flexibility to create custom solutions tailored to the specific needs of DApp businesses.

**APRO Data Service** supports two data models—**Data Push** and **Data Pull**—that deliver real-time Price Feeds and other essential data services, ensuring comprehensive support for all DApp business scenarios. Currently, we support 161 Price Feed services across 15 major blockchain networks:

* **Data Push**: APRO Data Push uses a "Push-Based" data model to deliver Price Feed services. Decentralized independent node operators continuously gather and push data updates to the blockchain when certain price thresholds or time intervals are met. This method improves blockchain scalability, supports various data products, and provides timely updates.
* **Data Pull:** APRO Data Pull uses a "Pull-Based" data model to deliver real-time Price Feed services to dApps. It is designed for on-demand access, high-frequency updates, low latency, and cost-effective integration. This flexible and efficient model is ideal for DeFi protocols, decentralized exchanges, and other applications needing rapid, dynamic data without ongoing on-chain costs.

We continually refine and optimize our platform to deliver enhanced services and experiences, driving forward the development and application of blockchain technology.

### Key Benefits of APRO Data Service

* **Advantages of APRO Combination of Off-Chain Computing and On-Chain Verification**\
  APRO platform integrates off-chain computing with on-chain verification to extend computing capabilities and data access while ensuring system security and reliability.<br>
* **Customization of Secure and Trustworthy Computing Logic**\
  DApp businesses can customize computing logic according to their needs and run it on the APRO platform, achieving personalized business logic processing without concerns about security issues. <br>
* **Enhancement of Oracle Network Security and Stability**\
  We focus on enhancing the security and stability of the Oracle network through various measures to ensure continuous service capability.<br>
* **Hybrid Node Approach**\
  Introducing a Hybrid node approach that combines on-chain and off-chain computing resources to improve computing efficiency and performance.<br>
* **Multi-Network Network Communication Scheme**\
  Establishing a multi-centralized network communication scheme ensures network stability and reliability while reducing the risk of single-point failures. <br>
* **TVWAP Price Discovery Mechanism**\
  Applying the TVWAP price discovery mechanism ensures fairness and accuracy of data prices, preventing data tampering and malicious manipulation.&#x20;

### &#x20;<a href="#getting-started" id="getting-started"></a>

<br>


# Data Push

### Data Push: Threshold-Based Data Updates

APRO Data Push offers a **"Push-Based"** data model, which we use to provide [**Price Feed**](https://docs.apro.com/en/data-push/price-feed-contract) services. In this model, decentralized independent node operators continuously aggregate and push data updates to the blockchain when specific price thresholds or heartbeat intervals are reached. This approach enhances blockchain scalability, supports a broader range of data products, and ensures timely updates.

### Trusted Data for DeFi

APRO Data **Push** **Model** is widely utilized in various applications, especially in DeFi protocols and smart contracts, providing highly trusted, real-time, and secure data. It is also critical for emerging markets like Bitcoin Layer 2, addressing the growing demand for precise data in blockchain applications.

### Reliable Data Transmission

The APRO Data Push model employs multiple high-quality data transmission methods, leveraging a hybrid node architecture, multi-centralized communication networks, the TVWAP price discovery mechanism, and a self-managed multi-signature framework. This ensures the delivery of accurate, tamper-resistant data, safeguarded against vulnerabilities or oracle-based attacks, ensuring reliability across diverse use cases.


# Proof of Reserve

Proof of Reserve (PoR) is a blockchain-based reporting system that provides transparent and real-time verification of asset reserves backing tokenized assets. APRO RWA Oracle offers advanced PoR capabilities to ensure institutional-grade security and compliance.

### **Key Features**

1. **Intelligent PoR Data Collection** APRO integrates multiple data sources to deliver comprehensive reserve reporting:
   1. **Data Sources:**
      * Exchange APIs (e.g., Binance PoR, Coinbase reserve reports).
      * DeFi protocols (BTC/Ethereum/BSC/Polygon staking data).
      * Traditional institutions (banks, custodians).
      * Regulatory filings (SEC reports, audit documentation).
   2. **AI-Driven Processing:**
      * Automated document parsing (e.g., PDF financial reports, audit records).
      * Multilingual data standardization.
      * Anomaly detection and validation.
      * Risk assessment and early warning systems.
2. **Automated Reporting** APRO employs the MCP (Multi-Chain Protocol) for efficient data transmission and report generation:
   1. ```
      User Request → AI (LLM) → MCP Protocol → Oracle Adapter → Blockchain Data → Report Generation
      ```
   2. **Report Structure:**
      * Asset-liability summary.
      * Collateral ratio calculations.
      * Asset category breakdown.
      * Compliance status evaluation.
      * Risk assessment report.
3. **Real-Time Monitoring and Alerts** APRO provides continuous monitoring of key reserve metrics and triggers alerts for critical events:
   1. **Monitoring Indicators:**
      * Reserve ratio tracking.
      * Asset ownership changes.
      * Compliance status monitoring.
      * Market risk evaluation.
   2. **Alert Triggers:**
      * Reserve ratio falling below 100%.
      * Unauthorized asset modifications.
      * Regulatory compliance anomalies.
      * Significant audit findings.
   3. ### &#x20; **PoR Reporting Workflow**
   4. <pre><code><strong>Request Trigger:
      </strong>User interface request → Protocol specification → Data scope determination.

      <strong>AI-Driven Data Collection:
      </strong>Oracle adapter invocation → Multi-source data acquisition → MCP protocol transmission.

      <strong>Intelligent Analysis:
      </strong>LLM data parsing → Financial analysis → Risk evaluation → Report structuring.

      <strong>Validation and Consensus:
      </strong>Multi-node validation → Data consistency checks → Consensus confirmation.

      <strong>On-Chain Storage:
      </strong>Report hash submission → Full report Greenfield storage → Index creation.

      <strong>User Access:
      </strong>Web interface display → API access → Historical query support.
      </code></pre>

### **Proof of Reserve (PoR) Report Interface Specification**

The APRO RWA Oracle offers a dedicated interface for generating, querying, and retrieving Proof of Reserve (PoR) reports. This interface ensures transparency, reliability, and ease of integration for decentralized applications requiring reserve verification.

<pre><code>interface IPoRReporting {
<strong>    // PoR Report Generation
</strong>    function generatePoRReport(string memory protocolName) external returns (bytes32 reportId);
    
<strong>    // Report Status Query
</strong>    function getReportStatus(bytes32 reportId) external view returns (uint8 status, string memory ipfsHash);
    
<strong>    // Latest Report Retrieval
</strong>    function getLatestReport(string memory protocolName) external view returns (bytes32 reportId, uint256 timestamp);
}
</code></pre>

### Integration Guide (Based on DataPush)

For integration instructions, please refer to the [documentation](/en/data-service/data-serivce/data-push).

For enterprise solutions, please contact us at <bd@apro.com>


# Data Pull

### Data Pull: On-Demand & Real-Time&#x20;

APRO Data Pull offers a "**Pull-Based**" data model, which we use to provide [**real-time Price Feed** ](https://docs.apro.com/en/data-pull/price-feed-id)services to decentralized applications (dApps). This solution is specifically designed for use cases that demand **on-demand** access, **high-frequency** updates, **low latency**, and **cost-effective** data integration. The model excels in the oracle ecosystem by emphasizing flexibility and efficiency, making it particularly suitable for DeFi protocols, decentralized exchanges, and other applications that require rapid, dynamic data without continuous on-chain costs.

### On-Demand Data for DeFi & Derivatives

The APRO **Pull** **Model** is particularly advantageous for DeFi protocols and derivatives platforms where high-frequency and low-latency price updates are crucial. For example, in a derivatives platform, a trade might only require the latest price when a user executes a transaction. With APRO’s pull-based oracle, the necessary data can be fetched and verified at that specific moment, ensuring accuracy and minimizing costs.

### Key Features of APRO Data Pull

* **On-Demand & Cost-Efficient**

  Unlike the continuous updates of a push-based model, APRO's pull-based approach allows applications to fetch data only when needed, reducing unnecessary on-chain transactions and saving on gas fees. This makes it an ideal solution for real-time data access with improved cost efficiency, especially for applications needing frequent updates or managing multiple assets.
* **Customizable Data Frequency**

  The pull model enables developers to determine how frequently they pull data. This allows the model to accommodate both applications needing constant high-frequency data and those that only require updates during specific events, such as trading or settlement periods.
* **Flexible Scalability**

  With the ability to access data dynamically, APRO’s pull model supports a greater range of assets and market conditions. It provides the infrastructure for applications to scale in complexity while keeping the system’s efficiency intact.
* **Data Verification & Security**

  APRO ensures a secure and trustworthy computing environment by combining off-chain data retrieval with on-chain verification. This cryptographic verification process guarantees that the data pulled from off-chain sources is accurate, tamper-resistant, and agreed upon by a decentralized oracle network.


# RWA

RWA Price Feed is a decentralized asset pricing mechanism designed to provide real-time, tamper-proof valuation data for tokenized Real-World Assets (RWAs). This service is particularly tailored for assets like U.S. Treasuries, equities, commodities, and tokenized real estate indices. By leveraging advanced algorithms and decentralized validation, APRO RWA Oracle ensures accurate and manipulation-resistant pricing data.

### **Key Features**

1. **Multi-Asset Support**
   1. APRO RWA Oracle supports a wide range of asset classes, including:
      1. **Fixed Income:** U.S. Treasuries, corporate bonds, municipal bonds.
      2. **Equities:** S\&P 500 constituents, ETFs, REITs.
      3. **Commodities:** Precious metals, energy, agricultural products, industrial metals.
      4. **Real Estate:** Tokenized property indices, commercial property valuation.
   2. **Core Algorithm** The **Time-Volume Weighted Average Price (TVWAP)** algorithm is employed to calculate asset prices with high accuracy.
   3. ```
      TVWAP = Σ(Price_i × Volume_i × Time_Weight_i) / Σ(Volume_i × Time_Weight_i)
      ```
   4. **Update Frequency:**
      1. High-frequency assets (e.g., equities): Every 30 seconds.
      2. Medium-frequency assets (e.g., bonds): Every 5 minutes.
      3. Low-frequency assets (e.g., real estate): Every 24 hours.
2. **Anti-Manipulation Mechanisms** APRO employs multi-source data aggregation and advanced anomaly detection algorithms to ensure pricing integrity:
   1. **Data Sources:**
      * Centralized exchanges (NYSE, NASDAQ, Bloomberg).
      * Decentralized exchanges (Uniswap, Curve, Balancer).
      * Institutional APIs (Reuters, TradeFi).
      * Government data (Federal Reserve, Treasury).
   2. **Validation Techniques:**
      * Median-value algorithms for outlier rejection.
      * Z-score statistical anomaly detection.
      * Dynamic thresholds for market volatility adaptation.
      * Sliding window smoothing.
3. **Consensus-Based Validation**
   1. &#x20; Utilizing PBFT (Practical Byzantine Fault Tolerance) consensus mechanisms, APRO ensures data integrity through:
   2. Minimum of seven validation nodes.
   3. Two-thirds majority consensus requirement.
   4. Three-stage submission process.
   5. Validator reputation scoring system.

### **Unique Technological Innovations**

1. **AI-Enhanced Oracle**
   1. &#x20; The APRO RWA Oracle leverages cutting-edge AI technologies to redefine traditional oracle functionalities, offering proactive, intelligent, and adaptive solutions tailored for Real-World Asset (RWA) tokenization.

**Comparison: Traditional Oracles vs. AI-Enhanced Oracle**

* **Traditional Oracles:**
  * Simple data aggregation.
  * Passive response mechanisms.
* **RWA Oracle:**
  * **AI-Driven Analysis:** Proactively analyzes asset data in real-time.
  * **Smart Anomaly Detection:** Identifies irregularities using predictive algorithms.
  * **Adaptive Adjustment:** Automatically adjusts parameters based on dynamic market conditions.

**AI Capabilities**The AI engine embedded in APRO RWA Oracle provides advanced functionalities that surpass traditional oracle systems:

1. **Intelligent Document Parsing:**
   1. Processes and extracts data from complex documents such as audit reports, regulatory filings, and financial statements.
   2. Supports multilingual data standardization for global applicability.
2. **Multi-Dimensional Risk Assessment:**
   1. Evaluates risks across multiple dimensions, including financial, regulatory, and operational aspects.
   2. Provides early warnings for potential vulnerabilities or compliance issues.
3. **Predictive Anomaly Detection:**
   1. Uses machine learning models to forecast and detect anomalies before they impact asset valuations or reserve ratios.
   2. Ensures proactive risk mitigation.
4. **Natural Language Report Generation:**
   1. Automatically generates human-readable reports summarizing asset performance, risk assessments, and compliance status.
   2. Enhances accessibility for stakeholders and regulators.
5. **Third-Party Neutral Validation**
   1. **Problem:** Self-hosted oracles often face conflicts of interest due to issuer control.
   2. **Solution:** APRO employs an independent third-party node network to ensure neutrality and eliminate issuer manipulation. This decentralized validation mechanism guarantees unbiased and tamper-proof data feeds.
6. **Dynamic Compliance Adaptation**
   1. **Problem:** Regulatory requirements are complex and constantly evolving, creating challenges for traditional systems to maintain compliance.
   2. **Solution:** APRO leverages AI-powered monitoring to track changes in regulatory frameworks and automatically adjust compliance parameters. This ensures seamless adherence to global standards, such as SEC filings, GDPR, and Basel III.
7. **Multi-Modal Data Integration**
   1. **Problem:** RWA data sources are highly heterogeneous, encompassing diverse formats such as documents, images, and structured datasets.
   2. **Solution:** APRO utilizes a unified AI processing engine capable of handling multi-modal data inputs, including text-based documents, visual imagery, and structured financial data. This comprehensive approach ensures accurate and reliable data aggregation across all asset classes.

### **RWA Price Feed Workflow**

<pre><code><strong>Data Collection:
</strong>Multi-source API calls → Data standardization → Timestamp marking.

<strong>Preprocessing:
</strong>Anomaly detection → TVWAP calculation → Confidence interval estimation.

<strong>Consensus Validation:
</strong>Node data submission → PBFT consensus → Two-thirds majority approval.

<strong>Cryptographic Verification:
</strong>Data signing → Merkle tree construction → Hash anchoring.

<strong>On-Chain Submission:
</strong>Smart contract invocation → State update → Event log recording.

<strong>Data Distribution:
</strong>API updates → User subscription notifications → Historical data storage.
</code></pre>

### **Price Feed Interface Specification**

The APRO RWA Oracle provides a robust and standardized interface for accessing real-time, proof-backed, and historical price data for tokenized Real-World Assets (RWAs). This interface is designed to ensure seamless integration with decentralized applications and smart contracts.

```
interface IRWAPriceFeed {
    // Real-Time Price Retrieval
    function getPrice(bytes32 assetId) external view returns (uint256 price, uint256 timestamp);
    
    // Proof-Backed Price Retrieval
    function getPriceWithProof(bytes32 assetId) external view returns (uint256 price, bytes memory proof);
    
    // Historical Price Query
    function getHistoricalPrice(bytes32 assetId, uint256 timestamp) external view returns (uint256 price);
}
```

### Integration Guide (Based on DataPull)

For integration instructions, please refer to the [documentation](/en/data-service/data-serivce/data-pull).

For enterprise solutions, please contact us at <bd@apro.com>


# Getting Started

You can use **APRO Data Push** to connect your smart contracts to asset pricing data. These data feeds aggregate information from many independent APRO node operators. Each price feed has an on-chain address and functions that enable contracts to read real-time pricing data directly from that address.

This section explains the **Data** **Push**, where APRO pushes real-time data to your contracts, allowing for immediate access to pricing updates without requiring frequent manual requests. This approach optimizes performance by reducing on-chain calls and enhances efficiency for applications that need continuous updates.

You'll learn how to read Data Feeds and store the value on-chain using **Solidity**. The code for reading Data Feeds on BitLayer or other EVM-compatible blockchains remains consistent across different chains and data feed types. You can choose various types of feeds depending on your use case, but the request and response format stays the same. However, the answer's decimal length and expected value ranges might differ depending on the feed you are using.

The contract has the following components:

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

import {AggregatorV3Interface} from "./AggregatorV3Interface.sol";

/**
 * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED
 * VALUES FOR CLARITY.
 * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE.
 * DO NOT USE THIS CODE IN PRODUCTION.
 */
 

contract DataConsumer {
    AggregatorV3Interface internal dataFeed;

    /**
     * Network: Bitlayer
     * Aggregator: BTC/USD
     * Address: 0x62d2c5dEe038FaEbc3F6ec498fD2Bbb3b0080B03
     */
    constructor() {
        dataFeed = AggregatorV3Interface(
            0x62d2c5dEe038FaEbc3F6ec498fD2Bbb3b0080B03
        );
    }

    /**
     * Returns the latest answer.
     */
    function getDataFeedLatestAnswer() public view returns (int) {
        // prettier-ignore
        (
        /* uint80 roundId */,
        int256 answer,
        /*uint256 startedAt*/,
        /*uint256 timeStamp*/,
        /*uint80 answeredInRound*/
        ) = dataFeed.latestRoundData();
        return answer;
    }

    /**
     * Returns decimals.
     */
    function getDecimals() public view returns (uint8) {
        uint8 decimals = dataFeed.decimals();
        return decimals;
    }
}
```

This example contract obtains the latest price answer from the BTC / USD feed on the Bitlayer testnet.

<br>


# EVM Guides

This section provides essential guides for integrating APRO Price Feeds on EVM-compatible blockchains. Whether you're working with smart contracts or using APIs to fetch price data, these guides will help you implement APRO’s oracle solutions effectively.

1. [**Using Price Feed**](https://docs.apro.com/en/data-push/evm-guides/using-price-feed)\
   Learn how to read price feeds on-chain with Solidity and off-chain using Web3.js. This guide walks you through setting up your RPC endpoint, selecting the right Price Feed contract address, and interacting with data feeds for real-time price updates.
2. [**Price Feed API Reference**](https://docs.apro.com/en/data-push/evm-guides/price-feed-api-reference)\
   A technical reference for using the AggregatorV3Interface to fetch price data. This guide explains how to retrieve feed details like round data, descriptions, and decimal precision, ensuring you can accurately integrate APRO Price Feeds into your dApps.

These resources are designed to help you leverage APRO’s decentralized oracle network for secure and precise price data in your blockchain applications.


# Using Price Feed

The code for reading **Data Push** is the same across all EVM-compatible blockchains and **price feed** types. You choose different types of **price feed** for different uses, but the request and response format are the same. To read a **price feed**, specify the following variables:

* **RPC endpoint URL:** This determines which network that your smart contracts will run on. You can use a node provider service or point to your xown client. If you are using a Web3 wallet, it is already configured with the RPC endpoints for several networks and the [Remix IDE](https://remix-project.org/) will automatically detect them for you.
* **Feed contract address:** This determines which Price Feed your smart contract will read. Contract addresses are different for each network. You can find the available contract addresses on the following pages:
  * [Price Feed Contract Addresses](https://docs.apro.com/en/data-push/price-feed-contract)

The examples in this document indicate these variables, but you can modify the examples to work on different networks and read different feeds.

This guide shows example code that reads Price Feed using the following languages:

* Onchain consumer contracts:
  * [Solidity](#solidity)
* Offchain reads using Web3 packages:
  * [Javascript](#javascript) with [web3.js](https://web3js.readthedocs.io/)

## Reading data feeds on-chain <a href="#reading-data-feeds-onchain" id="reading-data-feeds-onchain"></a>

These code examples demonstrate how to deploy a consumer contract on-chain that reads a data feed and stores the value.

### Solidity <a href="#solidity" id="solidity"></a>

To consume price data, your smart contract should reference [`AggregatorV3Interface`](/en/data-push/evm-guides/price-feed-api-reference#aggregatorv3interface), which defines the external functions implemented by Data Feeds.

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

/**
 * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED
 * VALUES FOR CLARITY.
 * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE.
 * DO NOT USE THIS CODE IN PRODUCTION.
 */

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
    );

}


contract DataConsumer {
    AggregatorV3Interface internal dataFeed;

    /**
     * Network: Bitlayer
     * Aggregator: BTC/USD
     * Address: 0x62d2c5dEe038FaEbc3F6ec498fD2Bbb3b0080B03
     */
    constructor() {
        dataFeed = AggregatorV3Interface(
            0x62d2c5dEe038FaEbc3F6ec498fD2Bbb3b0080B03
        );
    }

    /**
     * Returns the latest answer.
     */
    function getDataFeedLatestAnswer() public view returns (int) {
        // prettier-ignore
        (
        /* uint80 roundId */,
        int256 answer,
        /*uint256 startedAt*/,
        /*uint256 timeStamp*/,
        /*uint80 answeredInRound*/
        ) = dataFeed.latestRoundData();
        return answer;
    }

    /**
     * Returns decimals.
     */
    function getDecimals() public view returns (uint8) {
        uint8 decimals = dataFeed.decimals();
        return decimals;
    }
}
```

The `latestRoundData` function returns five values representing information about the latest price data. See the [Data Feeds API Reference](/en/data-push/evm-guides/price-feed-api-reference)[ ](/en/data-push/evm-guides/price-feed-api-reference)for more details.

## Reading data feeds off-chain <a href="#reading-data-feeds-offchain" id="reading-data-feeds-offchain"></a>

These code examples demonstrate how to read data feeds directly off-chain using Web3 packages for each language.

### Javascript <a href="#javascript" id="javascript"></a>

This example uses [web3.js](https://web3js.readthedocs.io/) to retrieve feed data from the BTC / USD feed on the BitLayer testnet.

```javascript
/**
 * THIS IS EXAMPLE CODE THAT USES HARDCODED VALUES FOR CLARITY.
 * THIS IS EXAMPLE CODE THAT USES UN-AUDITED CODE.
 * DO NOT USE THIS CODE IN PRODUCTION.
 */

const Web3 = require("web3") // for nodejs only
const web3 = new Web3("https://testnet-rpc.bitlayer.org")
const aggregatorV3InterfaceABI = [
    {
        inputs: [],
        name: "decimals",
        outputs: [{ internalType: "uint8", name: "", type: "uint8" }],
        stateMutability: "view",
        type: "function",
    },
    {
        inputs: [],
        name: "description",
        outputs: [{ internalType: "string", name: "", type: "string" }],
        stateMutability: "view",
        type: "function",
    },
    {
        inputs: [{ internalType: "uint80", name: "_roundId", type: "uint80" }],
        name: "getRoundData",
        outputs: [
            { internalType: "uint80", name: "roundId", type: "uint80" },
            { internalType: "int256", name: "answer", type: "int256" },
            { internalType: "uint256", name: "startedAt", type: "uint256" },
            { internalType: "uint256", name: "updatedAt", type: "uint256" },
            { internalType: "uint80", name: "answeredInRound", type: "uint80" },
        ],
        stateMutability: "view",
        type: "function",
    },
    {
        inputs: [],
        name: "latestRoundData",
        outputs: [
            { internalType: "uint80", name: "roundId", type: "uint80" },
            { internalType: "int256", name: "answer", type: "int256" },
            { internalType: "uint256", name: "startedAt", type: "uint256" },
            { internalType: "uint256", name: "updatedAt", type: "uint256" },
            { internalType: "uint80", name: "answeredInRound", type: "uint80" },
        ],
        stateMutability: "view",
        type: "function",
    },
    {
        inputs: [],
        name: "version",
        outputs: [{ internalType: "uint256", name: "", type: "uint256" }],
        stateMutability: "view",
        type: "function",
    },
]
const addr = "0x62d2c5dEe038FaEbc3F6ec498fD2Bbb3b0080B03"
const priceFeed = new web3.eth.Contract(aggregatorV3InterfaceABI, addr)
priceFeed.methods
    .latestRoundData()
    .call()
    .then((roundData) => {
        // Do something with roundData
        console.log("Latest Round Data", roundData)
    })

```


# Price Feed API Reference

When you use price feed, retrieve the feeds through the `AggregatorV3Interface` and the proxy address.&#x20;

## AggregatorV3Interface <a href="#aggregatorv3interface" id="aggregatorv3interface"></a>

Import this interface to your contract and use it to run functions in the proxy contract. Create the interface object by pointing to the proxy address. For example, on Bitlayer you could create the interface object in the constructor of your contract using the following example:

```solidity
/**
 * Network: Bitlayer
 * Data Feed: BTC/USD
 * Address: 0x62d2c5dEe038FaEbc3F6ec498fD2Bbb3b0080B03
 */
constructor() {
  priceFeed = AggregatorV3Interface(0x62d2c5dEe038FaEbc3F6ec498fD2Bbb3b0080B03);
}
```

```solidity
// 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
    );

}
```

## Functions in AggregatorV3Interface <a href="#functions-in-aggregatorv3interface" id="functions-in-aggregatorv3interface"></a>

| Name                          | Description                                                          |
| ----------------------------- | -------------------------------------------------------------------- |
| [decimals](#decimals)         | The number of decimals in the response.                              |
| [description](#description)   | The description of the aggregator that the proxy points to.          |
| [getRoundData](#getrounddata) | Get data from a specific round.                                      |
| [version](#version)           | The version representing the type of aggregator the proxy points to. |

### **decimals**

Get the number of decimals present in the response value.

```solidity
function decimals() external view returns (uint8);
```

* `RETURN`: The number of decimals.

### **description**

Get the description of the underlying aggregator that the proxy points to.

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

* `RETURN`: The description of the underlying aggregator.

### **getRoundData**

Get data about a specific round, using the `roundId`.

```solidity
function getRoundData(
  uint80 _roundId
) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
```

**Parameters:**

* `_roundId`: The round Id

**Return values:**

* `roundId`: The round Id
* `answer`: The answer for this round
* `startedAt`: Timestamp of when the round started
* `updatedAt`: Timestamp of when the round was updated
* `answeredInRound`:  The round Id of the round in which the answer  was computed

### **version**

The version representing the type of aggregator the proxy points to.

```solidity
function version() external view returns (uint256)
```

* `RETURN`: The version number.<br>


# Price Feed Contract

## Supported Chains

[**Base**](#base-mainnet) | [**CORE**](#core-mainnet) | [**BNB Smart Chain**](#bnb-smart-chain-mainnet) | [**IoTeX**](#iotex-mainnet) | [**ZetaChain**](#zetachain-mainnet) | [**Taiko**](#taiko-mainnet) | [**DuckChain**](#duckchain-mainnet) | [**Goat**](#goat-mainnet) | [**HashKey**](#hashkey-mainnet) | [**Merlin**](#merlin-mainnet) | [**BOB**](#bob-mainnet) | [**Manta**](#manta-mainnet) | [**TAC**](#tac-mainnet) | [**Arbitrum**](#arbitrum-mainnet) | [**Rootstock**](#rootstock-mainnet) | [**Sei**](#sei-mainnet) | [**Ethereum**](#ethereum-mainnet) |[**Arc**](#arc-mainnet)

For inquiries regarding Price Feeds for additional chains, please contact us at:

* Email: <bd@apro.com>
* Telegram: [Head of Business Development](https://t.me/Annie_LLLEEE)

### Base Mainnet <a href="#base-mainnet" id="base-mainnet"></a>

<table><thead><tr><th width="160">Pair</th><th width="136">Deviation</th><th width="131">Heartbeat</th><th>Contract Address</th></tr></thead><tbody><tr><td>BTC/USD</td><td>5%</td><td>180d</td><td>0xc25dD8C66b05C1C704339a73B6d21fB6076c5601</td></tr></tbody></table>

### CORE Mainnet <a href="#core-mainnet" id="core-mainnet"></a>

<table><thead><tr><th width="205">Pair</th><th width="128">Deviation</th><th width="119">Heartbeat</th><th>Contract Address</th></tr></thead><tbody><tr><td>CORE/USD</td><td>2%</td><td>24h</td><td>0x95CF37918d09006abA83e51b13F7B721D55cd300</td></tr><tr><td>BTC/USD</td><td>2%</td><td>24h</td><td>0x8b5BA8C397FAcf5516EDAf745c074B8C7fED1D78</td></tr><tr><td>USDT/USD</td><td>0.1%</td><td>24h</td><td>0x992388eeEc9F2b0e44059113f2c84e5dA44293db</td></tr><tr><td>USDC/USD</td><td>0.1%</td><td>24h</td><td>0x4aF9fAFbb7fEe76655F2D328c2f9b9a5BD49a4d9</td></tr><tr><td>CLND/USD</td><td>2%</td><td>24h</td><td>0xf08E62F2002Db9A21bF89011D69Bb7421e140F98</td></tr><tr><td>SolvBTC.b(CORE CHAIN)/USD</td><td>2%</td><td>24h</td><td>0x17745bD700dD0A3a9F7d1D20261b79B33BB58506</td></tr><tr><td>SolvBTC.core(CORE CHAIN)/USD</td><td>2%</td><td>24h</td><td>0x0EEbA396Ec6bAAf0D153f7b104CbB0925ac178cc</td></tr><tr><td>aBTC(CORE CHAIN)/USD</td><td>2%</td><td>24h</td><td>0x75BA7d6A49cDc382401AD97348d56ed0f6D846e7</td></tr><tr><td>SolvBTC.m/M-BTC Exchange Rate</td><td>2%</td><td>24h</td><td>0x571b77B3511ba6A097cd219023DBc7a0820DB797</td></tr><tr><td>M-BTC/BTC Exchange Rate</td><td>2%</td><td>10d</td><td>0x1d2A520438C5764b4946101dd9544CEB1Af0d872</td></tr><tr><td>M-BTC/USD (M-BTC/BTC Rate Mul BTC/USD)</td><td>2%</td><td>24h</td><td>0x219491D3D577537C66d1D3d21C0eC3486042065b</td></tr><tr><td>SolvBTC.b/BTCB Exchange Rate</td><td>2%</td><td>24h</td><td>0x4cCcfB997BDe5CF803b69D45d029E756eFa60552</td></tr><tr><td>AUSD/USD</td><td>2%</td><td>24h</td><td>0x396861A1a9190CA43E1046a31eff98CF8492a265</td></tr><tr><td>EURC/USD</td><td>2%</td><td>24h</td><td>0xc9cf39BBA7aE06e71C6dE2b2f63dea6df3F05c4e</td></tr><tr><td>PUFETH/USD</td><td>2%</td><td>24h</td><td>0xCdB10dC9dB30B6ef2a63aB4460263655808fAE27</td></tr><tr><td>ETH/USD</td><td>2%</td><td>24h</td><td>0x1a59026EB06D7CC416A78418c767D1CFb8d61dc4</td></tr></tbody></table>

### BNB Smart Chain Mainnet <a href="#bnb-smart-chain-mainnet" id="bnb-smart-chain-mainnet"></a>

<table><thead><tr><th width="213">Pair</th><th width="143">Deviation</th><th width="132">Heartbeat</th><th>Contract Address</th></tr></thead><tbody><tr><td>BTC/USD</td><td>2%</td><td>24h</td><td>0xD71E8d3A49A5325F41e5c50F04E74C7281b37f9D</td></tr><tr><td>ETH/USD</td><td>2%</td><td>24h</td><td>0xc7c18F507617eac8CAF15d4aaa9D208ad1314F67</td></tr><tr><td>USDT/USD</td><td>0.1%</td><td>24h</td><td>0xa1b70AADB162Ea9c7A1e5dD23720E6d4343C9264</td></tr><tr><td>USDC/USD</td><td>0.1%</td><td>24h</td><td>0x463e8F1CB7F663afee6e66717FE0b896FBA9689C</td></tr><tr><td>FDUSD/USD</td><td>2%</td><td>24h</td><td>0x2570308fE6Ec17f3A50FB4C806EE7572d452C124</td></tr><tr><td>BNB/USD</td><td>2%</td><td>24h</td><td>0xE3571D2426E842fa3422E1610678506EB34675F6</td></tr><tr><td>stBTC/BTC Exchange Rate</td><td>10%</td><td>10d</td><td>0x5665ca3CEcD5b6D2e31cC35adA8b599E3e1032CE</td></tr><tr><td>stBTC/USD(stBTC/BTC Rate Mul BTC/USD)</td><td>2%</td><td>24h</td><td>0x60aEAC948646e82238e56d88B90e5e8a7D4a4fCF</td></tr><tr><td>LISTA/USD</td><td>2%</td><td>24h</td><td>0x2e634550F6325Cc470B07b80aDA531A236E69dbf</td></tr><tr><td>ENZOBTC/USD</td><td>2%</td><td>24h</td><td>0x951A6859da83AA1D1F026D38fCE3a440561dD9Be</td></tr><tr><td>U/USDT</td><td>1%</td><td>24h</td><td>0x3B16C058495DaFAC5984A932AF3E62580abDbaF4</td></tr><tr><td>SNDKB/USD</td><td>1%</td><td>1h</td><td>0xDCDa13B927F7d7641470a0d3173709d69443A361</td></tr><tr><td>MUB/USD</td><td>1%</td><td>1h</td><td>0x9bDd29A3e175855d3DaD239F15fc7bFe1Fd70095</td></tr><tr><td>TSLAB/USD</td><td>1%</td><td>1h</td><td>0xe1bc21701Bc8FFa39DaecDb8f58263C1d5e1c0bc</td></tr><tr><td>NVDAB/USD</td><td>1%</td><td>1h</td><td>0x310EFC9Fefe89B8085F89E91Ac782Bef6416499E</td></tr><tr><td>CRCLB/USD</td><td>1%</td><td>1h</td><td>0x48e6876A8CDa6cf8db2089128cF20a18e58089D2</td></tr><tr><td>SPCXB/USD</td><td>1%</td><td>1h</td><td>0x44c4173459121690613Bc22C110c4f0624254f3E</td></tr><tr><td>LITEB/USD</td><td>1%</td><td>1h</td><td>0x0fa60412153Edc1A051F7056EFCD0F1b95064eEe</td></tr><tr><td>METAB/USD</td><td>1%</td><td>1h</td><td>0x32Fd1E5E20b091Df7286EE8C69937C4A8D619885</td></tr><tr><td>MSFTB/USD</td><td>1%</td><td>1h</td><td>0xBC92F296c48E31409eD4DbD638F1fbe0ee5A3724</td></tr><tr><td>PLTRB/USD</td><td>1%</td><td>1h</td><td>0xBb0535d8C1B1adB790beD2d9b84d4Dbc78fdD902</td></tr><tr><td>QQQB/USD</td><td>1%</td><td>1h</td><td>0x2708567c468db65a72095716FCff023dcDfEA07A</td></tr><tr><td>SKHYB/USD</td><td>1%</td><td>1h</td><td>0x2446DCeDd294EDB5d90Ee16Fa32Da56Bc2973ACd</td></tr></tbody></table>

### IoTeX Mainnet <a href="#iotex-mainnet" id="iotex-mainnet"></a>

<table><thead><tr><th width="161">Pair</th><th width="117">Deviation</th><th width="115">Heartbeat</th><th>Contract Address</th></tr></thead><tbody><tr><td>IOTX/USD</td><td>2%</td><td>24h</td><td>0xdD9e60FECC05EC3ea2dE0938Dd5F1d3841851A1C</td></tr><tr><td>BTC/USD</td><td>2%</td><td>24h</td><td>0x0ae292203f96412Bb74A915304357Ae794A0e22b</td></tr><tr><td>USDT/USD</td><td>0.1%</td><td>24h</td><td>0x09855b01E2DA90eCE1bD5F8803730cfE54575393</td></tr><tr><td>USDC/USD</td><td>0.1%</td><td>24h</td><td>0xB6d107352806647918a7eA6832d0577e8d023B45</td></tr><tr><td>ETH/USD</td><td>2%</td><td>24h</td><td>0xf2b6C85b5672b544AAfF1fDED37C7BE980F5279d</td></tr><tr><td>ioUSD/USD</td><td>0.1%</td><td>24h</td><td>0x09eCbf067a638C7550d6C68abFDFE12569Ca837e</td></tr></tbody></table>

### ZetaChain Mainnet <a href="#zetachain-mainnet" id="zetachain-mainnet"></a>

<table><thead><tr><th width="160">Pair</th><th width="136">Deviation</th><th width="131">Heartbeat</th><th>Contract Address</th></tr></thead><tbody><tr><td>BTC/USD</td><td>2%</td><td>24h</td><td>0xc25dD8C66b05C1C704339a73B6d21fB6076c5601</td></tr><tr><td>ETH/USD</td><td>2%</td><td>24h</td><td>0x72C1B18a28A1071021e68a6E814cea618eE5bEde</td></tr><tr><td>ZETA/USD</td><td>2%</td><td>24h</td><td>0xAa3cA476Ac80a659CB7544BEEf86770c32c89f89</td></tr><tr><td>USDT/USD</td><td>0.1%</td><td>24h</td><td>0x149982E9b6375683e30f6EBF4F2820626A727580</td></tr><tr><td>USDC/USD</td><td>0.1%</td><td>24h</td><td>0x8f59aa9581B5a8E702bFc12b6693e325DABfc817</td></tr><tr><td>BNB/USD</td><td>2%</td><td>24h</td><td>0xF504Aef97769E473ACFe48960b7D4b5d622C82c8</td></tr></tbody></table>

### ZetaChain Testnet <a href="#zetachain-testnet" id="zetachain-testnet"></a>

<table><thead><tr><th width="160">Pair</th><th width="136">Deviation</th><th width="131">Heartbeat</th><th>Contract Address</th></tr></thead><tbody><tr><td>BTC/USD</td><td>2%</td><td>24h</td><td>0x64697A6Abb508079687465FA9EF99D2Da955D791</td></tr><tr><td>ETH/USD</td><td>2%</td><td>24h</td><td>0xC45D520D18A465Ec23eE99A58Dc4cB96b357E744</td></tr><tr><td>USDT/USD</td><td>0.1%</td><td>24h</td><td>0xCdB10dC9dB30B6ef2a63aB4460263655808fAE27</td></tr><tr><td>USDC/USD</td><td>0.1%</td><td>24h</td><td>0x9D8Fb4D15aB407bfbEDFEc2A58e312DB9CeC5Ab2</td></tr></tbody></table>

### Taiko Mainnet <a href="#taiko-mainnet" id="taiko-mainnet"></a>

<table><thead><tr><th width="188">Pair</th><th width="136">Deviation</th><th width="131">Heartbeat</th><th>Contract Address</th></tr></thead><tbody><tr><td>USDT/USD</td><td>0.1%</td><td>24h</td><td>0xD8eB39071D367259F75911B20334B07533f041a1</td></tr><tr><td>USDC/USD</td><td>0.1%</td><td>24h</td><td>0xCA7850bA277B731bf6E0144c4273b9064d8BEF7f</td></tr><tr><td>BTC/USD</td><td>2%</td><td>24h</td><td>0xD8Bc6717e87FE3D33a4B802ff1b2fE0586E00932</td></tr><tr><td>ETH/USD</td><td>2%</td><td>24h</td><td>0x6C639a58aC31cA5930Db557EF4d6eC9029bd8dE0</td></tr><tr><td>TAIKO/USD</td><td>2%</td><td>24h</td><td>0x39F962490911C80AadcF29EF59AC889827390A52</td></tr><tr><td>SolvBTC/USD</td><td>2%</td><td>24h</td><td>0xef3E9e75330f70A19C9149Fba5AB077e78D281AB</td></tr><tr><td>SolvBTC.bbn/USD</td><td>2%</td><td>24h</td><td>0xB8769A1b33983Ae6094854588fEF37B5B89389A9</td></tr><tr><td>stBTC/BTC Exchange Rate</td><td>0.5%</td><td>10d</td><td>0x581F3AbF95baa1D94B3175003bd316ca53F7f500</td></tr><tr><td>stBTC/USD(stBTC/BTC Rate Mul BTC/USD)</td><td>2%</td><td>24h</td><td>0xd4fA75445481fa583442Df528B9A90afdF973228</td></tr><tr><td>M-BTC/BTC Exchange Rate</td><td>0.5%</td><td>10d</td><td>0x484766BB65DC661e63b3B4A9f4b944C9B76fb2ed</td></tr><tr><td>M-BTC/USD(M-BTC/BTC Rate Mul BTC/USD)</td><td>2%</td><td>24h</td><td>0x8Ac048dfF049eF33f06A5EA65501494B795f0Be6</td></tr><tr><td>uniBTC/BTC Exchange Rate</td><td>0.5%</td><td>10d</td><td>0x1071d35Fe8b51f8573137e04e677a2c414Ea19E3</td></tr><tr><td>uniBTC/USD(uniBTC/BTC Rate Mul BTC/USD)</td><td>2%</td><td>24h</td><td>0xb8c9D07fF3C306B44d4D1752C8B0f72Fe32264d4</td></tr><tr><td>enzoBTC/BTC Exchange Rate</td><td>0.5%</td><td>10d</td><td>0x91f3b6667957Dba63E4a5d07a99681378DE89eF8</td></tr><tr><td>enzoBTC/USD(enzoBTC/BTC Rate Mul BTC/USD)</td><td>2%</td><td>24h</td><td>0x8Bf00d6A967836Da1494b96E08489A81C4abf202</td></tr></tbody></table>

### DuckChain Mainnet <a href="#duckchain-mainnet" id="duckchain-mainnet"></a>

DuckChain is currently under maintenance for an upgrade.

<table><thead><tr><th width="183">Pair</th><th width="136">Deviation</th><th width="131">Heartbeat</th><th>Contract Address</th></tr></thead><tbody><tr><td>BTC/USD</td><td>2%</td><td>24h</td><td>0x86B79c0F9B58CA8fd72Da05Af3Ed4c99C8140C79</td></tr><tr><td>ETH/USD</td><td>2%</td><td>24h</td><td>0xD8Bc6717e87FE3D33a4B802ff1b2fE0586E00932</td></tr><tr><td>TON/USD</td><td>2%</td><td>24h</td><td>0x336a553C46B831070f6d5EF804807f9f028Ace81</td></tr><tr><td>USDT/USD</td><td>0.1%</td><td>24h</td><td>0x39F962490911C80AadcF29EF59AC889827390A52</td></tr><tr><td>USDC/USD</td><td>0.1%</td><td>24h</td><td>0xc40d2b16fA4491Ba890f072f5d0327DA34BC3900</td></tr><tr><td>pumpBTC/USD</td><td>2%</td><td>24h</td><td>0xF2fC86aF5AD5Ee576881B5bE3ab97249ffDb6615</td></tr><tr><td>M-BTC/BTC Exchange Rate</td><td>2%</td><td>10d</td><td>0x981a9D38f6ca2359981CC5e4f92D48fb16133153</td></tr><tr><td>M-BTC/USD(M-BTC/BTC Rate Mul BTC/USD)</td><td>2%</td><td>24h</td><td>0xf2180a77A686b2D079fCce6bA22C59788B4C1160</td></tr><tr><td>uniBTC/BTC Exchange Rate</td><td>2%</td><td>10d</td><td>0x5C73a315C29C65d691CBc67F02E37d2DEAcfc25e</td></tr><tr><td>uniBTC/USD(uniBTC/BTC Rate Mul BTC/USD)</td><td>2%</td><td>24h</td><td>0x3f82c61FdC51a8DbF95E8d228831a8552462f726</td></tr></tbody></table>

### Goat Mainnet <a href="#goat-mainnet" id="goat-mainnet"></a>

<table><thead><tr><th width="160">Pair</th><th width="136">Deviation</th><th width="131">Heartbeat</th><th>Contract Address</th></tr></thead><tbody><tr><td>BTC/USD</td><td>5%</td><td>180d</td><td>0xB587aB45a92e19eE3e0d483bc629DE75Ed575025</td></tr></tbody></table>

### HashKey Mainnet <a href="#hashkey-mainnet" id="hashkey-mainnet"></a>

<table><thead><tr><th width="160">Pair</th><th width="136">Deviation</th><th width="131">Heartbeat</th><th>Contract Address</th></tr></thead><tbody><tr><td>BTC/USD</td><td>2%</td><td>24h</td><td>0x204ED500ab56A2E19B051561258E3A45c850360F</td></tr><tr><td>HSK/USD</td><td>2%</td><td>24h</td><td>0x86CE42c1b714149Dc3A7b17169EF67b5F78A224b</td></tr><tr><td>USDT/USD</td><td>0.1%</td><td>24h</td><td>0x823d7f90f7A3498DB6595886b6B5dC95E6B0B7f3</td></tr><tr><td>USDC/USD</td><td>0.1%</td><td>24h</td><td>0x244Ce344df8837c9d938867E2Ffbf0E4B0169B56</td></tr><tr><td>ETH/USD</td><td>2%</td><td>24h</td><td>0xbB091f3b515059b7A887eDcC73dC2a2Fa65E0242</td></tr></tbody></table>

### Merlin Mainnet <a href="#merlin-mainnet" id="merlin-mainnet"></a>

<table><thead><tr><th width="192">Pair</th><th width="138">Deviation</th><th width="126">Heartbeat</th><th>Contract Address</th></tr></thead><tbody><tr><td>USDT/USD</td><td>0.1%</td><td>24h</td><td>0x6C62446A0567176ddfA3FAB1269ce53773E32c64</td></tr><tr><td>USDC/USD</td><td>0.1%</td><td>24h</td><td>0x1D9494656465bEc3F6b51e14Eb6bd60EfD01EAa2</td></tr><tr><td>BTC/USD</td><td>1%</td><td>24h</td><td>0x07c9ECf0EBfC543C2EC874f1742D3758Dafd716C</td></tr><tr><td>MBTC/USD</td><td>1%</td><td>4h</td><td>0x4454dd04f16Bb78dc57fEb9885eAeFB3868e61b7</td></tr><tr><td>MERL/USD</td><td>1.5%</td><td>4h</td><td>0xA9266eC9E518704901DD428F66E63550FDFb5751</td></tr></tbody></table>

### BOB Mainnet <a href="#bob-mainnet" id="bob-mainnet"></a>

<table><thead><tr><th width="199">Pair</th><th width="147">Deviation</th><th width="123">Heartbeat</th><th>Contract Address</th></tr></thead><tbody><tr><td>BTC/USD</td><td>5%</td><td>180d</td><td>0x1Ff2fFada49646fB9b326EdF8A91446d3cf9a291</td></tr></tbody></table>

### Manta Mainnet <a href="#manta-mainnet" id="manta-mainnet"></a>

<table><thead><tr><th width="175">Pair</th><th width="134">Deviation</th><th width="114">Heartbeat</th><th>Contract Address</th></tr></thead><tbody><tr><td>BTC/USD</td><td>5%</td><td>180d</td><td>0xCe78278322ab90259A186606F5FA148c2EE7A63D</td></tr></tbody></table>

### Tac Mainnet <a href="#tac-mainnet" id="tac-mainnet"></a>

<table><thead><tr><th width="160">Pair</th><th width="136">Deviation</th><th width="131">Heartbeat</th><th>Contract Address</th></tr></thead><tbody><tr><td>BTC/USD</td><td>2%</td><td>24h</td><td>0xe3C2d89Ef01A06F1d2817036919e0424675290AD</td></tr><tr><td>GRAM/USD</td><td>2%</td><td>24h</td><td>0x0d72Da0e698D97538759174a66DB8cAA55522313</td></tr><tr><td>ETH/USD</td><td>2%</td><td>24h</td><td>0xd0E76152Af372D2a85FaF3E4c4E52E6F95e22e53</td></tr><tr><td>USDT/USD</td><td>1%</td><td>24h</td><td>0xE13FEf4A5940392941B51D0760b81750364F5aC5</td></tr></tbody></table>

### **Arbitrum** Mainnet <a href="#arbitrum-mainnet" id="arbitrum-mainnet"></a>

<table><thead><tr><th width="160">Pair</th><th width="136">Deviation</th><th width="131">Heartbeat</th><th>Contract Address</th></tr></thead><tbody><tr><td>BTC/USD</td><td>5%</td><td>180d</td><td>0xEA08eDe025B695bb9CC52b1A4036112eA2779B11</td></tr></tbody></table>

### **Rootstock** Mainnet <a href="#rootstock-mainnet" id="rootstock-mainnet"></a>

<table><thead><tr><th width="160">Pair</th><th width="136">Deviation</th><th width="131">Heartbeat</th><th>Contract Address</th></tr></thead><tbody><tr><td>SolvBTC/USD</td><td>2%</td><td>24h</td><td>0x7F67A7ccEFC52c07c6dBbd78204debD398e5cc0e</td></tr><tr><td>WETH/USD</td><td>2%</td><td>24h</td><td>0xb3eDFBa057eef8F479E08d637dbd615561a07390</td></tr><tr><td>RBTC/USD</td><td>2%</td><td>24h</td><td>0xd1dd9396946F45b5C03A247DB1703798a365eAe3</td></tr><tr><td>RIF/USD</td><td>5.5%</td><td>24h</td><td>0x91BC8A0E735cf4BBC5A1bD0CACFdFf5142FFFA91</td></tr><tr><td>USDC.E/USD</td><td>0.1%</td><td>24h</td><td>0x6A5B8118C8AAfFD6CAc53D62520134E03Db70a7A</td></tr><tr><td>USDT0/USD</td><td>0.1%</td><td>24h</td><td>0xDa3ca96a5cBECe75008457398222c5Ea860d876B</td></tr><tr><td>BPRO/USD</td><td>2%</td><td>24h</td><td>0x23abBa725F56F214254fADA4cE940e5634026713</td></tr><tr><td>USDRIF/USD</td><td>2%</td><td>24h</td><td>0xAe375dBf5755Aa55Ab4e80e052A54C4948095F35</td></tr><tr><td>DOC/USD</td><td>2%</td><td>24h</td><td>0x80c3AFbd7086Af1EF6D557445Ab7f5138F1F8056</td></tr><tr><td>xSolvBTC/USD</td><td>7%</td><td>24h</td><td>0xf2EFDd3E1f58fd8cA21baff70274d7f9aFc05524</td></tr><tr><td>RIFP/USD</td><td>3.5%</td><td>24h</td><td>0x0b232ad664df90f1e9103E7a3962f0883e38E71b</td></tr></tbody></table>

### **Rootstock** Testnet <a href="#rootstock-testnet" id="rootstock-testnet"></a>

<table><thead><tr><th width="160">Pair</th><th width="136">Deviation</th><th width="131">Heartbeat</th><th>Contract Address</th></tr></thead><tbody><tr><td>RIF/USD</td><td>5.5%</td><td>24h</td><td>0x1F26D1090049e61C4242C53616061c50ed839f95</td></tr><tr><td>USDT0/USD</td><td>0.1%</td><td>24h</td><td>0x1f53cfA60Fe217B144b06011f1B1CE5A6856555d</td></tr><tr><td>USDTRIF/USD</td><td>2%</td><td>24h</td><td>0x90bB9204675E98156Fe986ce9060199Eb707b248</td></tr></tbody></table>

### Sei Mainnet <a href="#sei-mainnet" id="sei-mainnet"></a>

<table><thead><tr><th width="160">Pair</th><th width="136">Deviation</th><th width="131">Heartbeat</th><th>Contract Address</th></tr></thead><tbody><tr><td>BTC/USD</td><td>5%</td><td>180d</td><td>0x7643669AC7D4dda146a247a511b7F7cB4870FDd5</td></tr></tbody></table>

### Ethereum Mainnet <a href="#ethereum-mainnet" id="ethereum-mainnet"></a>

<table><thead><tr><th width="160">Pair</th><th width="136">Deviation</th><th width="131">Heartbeat</th><th>Contract Address</th></tr></thead><tbody><tr><td>ENZOBTC/USD</td><td>2%</td><td>24h</td><td>0xd9e0c65a29167de3affd2768d24363c80f7e99a2</td></tr></tbody></table>

### Arc Mainnet

<table><thead><tr><th width="160">Pair</th><th width="136">Deviation</th><th width="131">Heartbeat</th><th>Contract Address</th></tr></thead><tbody><tr><td>BTC/USD</td><td>0.5%</td><td>3600s</td><td>0x4c39AFed709fA19eA912552cFaF8aD89d12a88c6</td></tr><tr><td>USDC/USD</td><td>0.1%</td><td>86400s</td><td>0x0C92645D7B1886458f819404c7FeEDDFE12d0C19</td></tr></tbody></table>

[*Return to top, view more chain options.*](#supported-chains)


# &#x20;Proof of Reserves Feed

**This page displays only Proof of Reserve Feed. For a complete list of available data service, please visit the** [**APRO Price Feed Contract**](https://docs.apro.com/en/data-push/price-feed-contract) **page to explore all available data service.**<br>

## Supported Chains

[**Ethereum**](#ethereum-mainnet) **|** [**BNB Smart Chain**](#bnb-smart-chain-mainnet)

## **Ethereum** Mainnet  <a href="#ethereum-mainnet" id="ethereum-mainnet"></a>

<table><thead><tr><th width="210">Pair</th><th width="112">Deviation</th><th width="110">Heartbeat</th><th>Contract Address</th></tr></thead><tbody><tr><td><strong>SUSD1+ Proof of Reserves</strong></td><td>1%</td><td>24h</td><td>0xe147204d163068f24334e9e6d4dcbb131fce5c3b</td></tr></tbody></table>

## BNB Smart Chain Mainnet <a href="#bnb-smart-chain-mainnet" id="bnb-smart-chain-mainnet"></a>

<table><thead><tr><th width="210">Pair</th><th width="112">Deviation</th><th width="110">Heartbeat</th><th>Contract Address</th></tr></thead><tbody><tr><td><strong>SUSD1+ Proof of Reserves</strong></td><td>1%</td><td>24h</td><td>0x1a59026EB06D7CC416A78418c767D1CFb8d61dc4</td></tr><tr><td><strong>BNB+ Proof of Reserves</strong></td><td>1%</td><td>24h</td><td>0x78438C22DFbF005813c7018e78250dc8ee506806</td></tr></tbody></table>

[*Return to top, view more chain options.*](#supported-chains)


# Getting Started

## Introduction

**APRO Data Pull** is a Oracle Product based on the pull-model. The **Pull model**, where price data is fetched from APRO's decentralized network only when required, providing cost-effective, on-demand access to updates. This model reduces the need for continuous on-chain interactions, ensuring accuracy and minimizing costs.

You can use **APRO Data Pull** to connect your smart contracts to **real-time asset pricing data**. These data feeds aggregate information from many independent APRO node operators, allowing contracts to fetch data **on-demand** when needed.&#x20;

## How to Use Real-Time Data

Anyone can submit a report verification to the on-chain APRO contract, the report includes the price, timestamp, signatures. The price data contained in the report will be stored in the contract for future use when the report is verified successfully.

This guide explains how to use real-time APRO data in EVM contracts.

1. **Acquire report data (include price, timestamp, signatures) from our Live-Api service**

Consensused price data is published via Live-Api Service. Please see the [**REST API & WebSocket Integration Guide**](https://docs.apro.com/en/data-pull/api-and-websocket-guide) for detailed instructions on fetching and decoding reports.

2. **Using the report data in the contract**

Report data can be used in the following scenarios.

**Scenario 1**: Get the latest price of a price feed from the Live-Api server, verify and update the price in the on-chain contract, and then use the latest price in subsequent business logic. The price update logic and business logic can be processed in the same transaction.

Suitable for on-chain applications that always use the latest price data. Please refer to the function ***verifyAndReadLatestPrice***.

**Scenario 2**: Get a specific timestamp price of a price feed from the Live-Api server, verify the price in the on-chain contract, and use this price in subsequent business logic.&#x20;

Suitable for on-chain applications that need a specific timestamp price data. Please refer to the function ***verifyAndReadThePrice***.

<mark style="color:red;">**WARN： The validity period of report data is 24 hours**</mark>, <mark style="color:red;">**so some not-so-new report data can also be verified successfully. Please ensure that you do not mistake this price for the latest price.**</mark>

**Scenario 3**: Get the latest price of a feed from the Live-Api server,  verify the price in the on-chain contract.&#x20;

This usage is similar to using the traditional push-model based oracle product. The price update logic and business logic are separated. Please refer to the function ***verifyReportWithWrapNativeToken*** or ***verifyReportWithNativeToken***.

**Scenario 4:** Read only the latest price of a feed that has been verified in the on-chain contract.&#x20;

The price read in this way  may be not timely if no other users actively submit report verifications. Please refer to the function ***readPrice***.

Here are some codes for your reference.

```solidity
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

interface IERC20 {
  /**
   * @dev Emitted when `value` tokens are moved from one account (`from`) to
   * another (`to`).
   *
   * Note that `value` may be zero.
   */
  event Transfer(address indexed from, address indexed to, uint256 value);

  /**
   * @dev Emitted when the allowance of a `spender` for an `owner` is set by
   * a call to {approve}. `value` is the new allowance.
   */
  event Approval(address indexed owner, address indexed spender, uint256 value);

  /**
   * @dev Returns the amount of tokens in existence.
   */
  function totalSupply() external view returns (uint256);

  /**
   * @dev Returns the amount of tokens owned by `account`.
   */
  function balanceOf(address account) external view returns (uint256);

  /**
   * @dev Moves `amount` tokens from the caller's account to `to`.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * Emits a {Transfer} event.
   */
  function transfer(address to, uint256 amount) external returns (bool);

  /**
   * @dev Returns the remaining number of tokens that `spender` will be
   * allowed to spend on behalf of `owner` through {transferFrom}. This is
   * zero by default.
   *
   * This value changes when {approve} or {transferFrom} are called.
   */
  function allowance(address owner, address spender) external view returns (uint256);

  /**
   * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * IMPORTANT: Beware that changing an allowance with this method brings the risk
   * that someone may use both the old and the new allowance by unfortunate
   * transaction ordering. One possible solution to mitigate this race
   * condition is to first reduce the spender's allowance to 0 and set the
   * desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   *
   * Emits an {Approval} event.
   */
  function approve(address spender, uint256 amount) external returns (bool);

  /**
   * @dev Moves `amount` tokens from `from` to `to` using the
   * allowance mechanism. `amount` is then deducted from the caller's
   * allowance.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * Emits a {Transfer} event.
   */
  function transferFrom(address from, address to, uint256 amount) external returns (bool);
}

library Common {
  // @notice The asset struct to hold the address of an asset and amount
  struct Asset {
    address assetAddress;
    uint256 amount;
  }
}

interface IWERC20 {
  function deposit() external payable;

  function withdraw(uint256) external;
}

interface IVerifierFeeManager {}

contract AproStructs {
    struct Price {
        uint192 value;
        int8 decimal;
        uint32 observeAt;
        uint32 expireAt;
    }
}

// Custom interfaces for IVerifierProxy and IFeeManager
interface IVerifierProxy {
    /**
     * @notice Verifies that the data encoded has been signed.
     * correctly by routing to the correct verifier, and bills the user if applicable.
     * @param payload The encoded data to be verified, including the signed
     * report.
     * @param parameterPayload Fee metadata for billing. For the current implementation this is just the abi-encoded fee token ERC-20 address.
     * @return verifierResponse The encoded report from the verifier.
     */
    function verify(
        bytes calldata payload,
        bytes calldata parameterPayload
    ) external payable returns (bytes memory verifierResponse);

    function s_feeManager() external view returns (IVerifierFeeManager);
}

interface IPriceReader {

    /// @notice Returns the period (in seconds) that a price feed is considered valid since its observe time
    function getValidTimePeriod() external view returns (uint256 validTimePeriod);

    function updateReport(bytes calldata report) external;

    function getPrice(
        bytes32 id
    ) external view returns (AproStructs.Price memory price);

    function getPriceUnsafe(
        bytes32 id
    ) external view returns (AproStructs.Price memory price);

    function getPriceNoOlderThan(
        bytes32 id,
        uint age
    ) external view returns (AproStructs.Price memory price);

}

interface IFeeManager {
    function getFeeAndReward(
        address subscriber,
        bytes memory unverifiedReport,
        address quoteAddress
    ) external returns (Common.Asset memory, Common.Asset memory, uint256);

    function i_linkAddress() external view returns (address);

    function i_nativeAddress() external view returns (address);

    function i_rewardManager() external view returns (address);
}

contract DemoContract {

    error NothingToWithdraw(); // Thrown when a withdrawal attempt is made but the contract holds no tokens of the specified type.
    error NotOwner(address caller); // Thrown when a caller tries to execute a function that is restricted to the contract's owner.

    struct Report {
        bytes32 feedId;
        uint32 validFromTimestamp; 
        uint32 observationsTimestamp;
        uint192 nativeFee;
        uint192 linkFee;
        uint32 expiresAt;
        uint192 price;
        uint192 bid; 
        uint192 ask;
    }

    IVerifierProxy public s_verifierProxy;

    address private s_owner;

    constructor(address _verifierProxy) {
        s_owner = msg.sender;
        s_verifierProxy = IVerifierProxy(_verifierProxy);
    }

    /// @notice Checks if the caller is the owner of the contract.
    modifier onlyOwner() {
        if (msg.sender != s_owner) revert NotOwner(msg.sender);
        _;
    }
    
    receive () external payable virtual {}

    /**
     * This method is an example of how to interact with the APRO contract.
     * Fetch the latest report from the live-api server and pass it to the APRO contract to verify the price.
     * If the price observation time in the report is later than the price observation time stored in the contract, the price in the contract will be updated.
     * 
     * @param payload The encoded report data contains the latest timestamp's price.
    */     

    function verifyAndReadLatestPrice(bytes calldata payload) public {

      (bytes32 feedId, , ) = verifyReportWithWrapNativeToken(payload);

      // Read the current price from a price feed if it is less than 60 seconds old.
      // Note: You can decrease the time value according to your business logic. 
      AproStructs.Price memory price = IPriceReader(address(s_verifierProxy)).getPriceNoOlderThan(feedId, 60);

      //do some business logic with the latest price

    }

    /**
     * This method is an example of how to interact with the APRO contract.
     * Fetch the report at a specific timestamp from the live-api server and pass it to the APRO contract to verify the price.
     * Note: This price contained in the report is not necessarily the latest price.
     * @param payload The encoded report data contains the feedId's specific timestamp's price.
    */     

    function verifyAndReadThePrice(bytes calldata payload) public {

      (bytes32 feedId, uint32 timestamp, uint192 verifiedPrice) = verifyReportWithWrapNativeToken(payload);

      //do some business logic with the verifiedPrice

    }

     /**
     * This method is an example of how to interact with the APRO contract.
     * Read the feedId's price through three methods.
     
     * @param feedId each price feed (e.g., BTC/USD) is identified by a price feed ID.
     * The complete list of feed IDs is available at https://docs.apro.com/en/data-pull/price-feed-id
    */     

    function readPrice(bytes32 feedId) public view returns(AproStructs.Price memory price){

      // Read the current price from a price feed.
      // Note: this transactions may failed with PriceFeedExpire or PriceFeedNotFound error
      AproStructs.Price memory price1 = IPriceReader(address(s_verifierProxy)).getPriceUnsafe(feedId);

      // Read the current price from a price feed if it is less than `validTimePeriod` (default: 120) seconds old.
      // Note: this transactions may failed with PriceFeedExpire or PriceFeedNotFound or StalePrice error
      //AproStructs.Price memory price2 = IPriceReader(address(s_verifierProxy)).getPrice(feedId);

      // Read the current price from a price feed if it is less than 60 seconds old.
      // Note: this transactions may failed with PriceFeedExpire or PriceFeedNotFound or StalePrice error
      //AproStructs.Price memory price3 = IPriceReader(address(s_verifierProxy)).getPriceNoOlderThan(feedId, 60);

      return price1;
    }


    function verifyReportWithWrapNativeToken(bytes calldata payload) public returns(bytes32, uint32, uint192){
        // Report verification fees
        IFeeManager feeManager = IFeeManager(address(s_verifierProxy.s_feeManager()));

        //decode the report from the payload
        (/* bytes32[3] reportContextData */ , bytes memory reportData,,,) = abi
        .decode(payload, (bytes32[3], bytes, bytes32[], bytes32[], bytes32));

        address feeTokenAddress = feeManager.i_nativeAddress();

        (Common.Asset memory fee, ,) = feeManager.getFeeAndReward(
            address(this),
            reportData,
            feeTokenAddress
        );

        // Approve feeManager to spend this contract's balance in fees
        IERC20(feeTokenAddress).approve(address(feeManager), fee.amount);

        // Verify the report
        bytes memory verifiedReportData = s_verifierProxy.verify(
            payload,
            abi.encode(feeTokenAddress)
        );

        // Decode verified report data into a Report struct
        Report memory verifiedReport = abi.decode(verifiedReportData, (Report));

        return (verifiedReport.feedId, verifiedReport.validFromTimestamp, verifiedReport.price);
    }

    
    function verifyReportWithNativeToken(bytes calldata payload) payable public returns(bytes32, uint32, uint192)  {
        // Report verification fees
        IFeeManager feeManager = IFeeManager(address(s_verifierProxy.s_feeManager()));
        address feeTokenAddress = feeManager.i_nativeAddress();

        //decode the report from the payload
        (/* bytes32[3] reportContextData */ , bytes memory reportData,,,) = abi
        .decode(payload, (bytes32[3], bytes, bytes32[], bytes32[], bytes32));

        (Common.Asset memory fee, ,) = feeManager.getFeeAndReward(
            address(this),
            reportData,
            feeTokenAddress
        );

        // Verify the report
        bytes memory verifiedReportData = s_verifierProxy.verify{value: msg.value}(
            payload,
            abi.encode(feeTokenAddress)
        );

        uint256 change;
        unchecked {
            //msg.value is always >= to fee.amount
            change = msg.value - fee.amount;
        }

        if (change != 0) {
            payable(msg.sender).transfer(change);
        }

        // Decode verified report data into a Report struct
        Report memory verifiedReport = abi.decode(verifiedReportData, (Report));
        return (verifiedReport.feedId, verifiedReport.validFromTimestamp, verifiedReport.price);
    }

    /**
     * @notice Withdraws all tokens of a specific ERC20 token type to a beneficiary address.
     * @dev Utilizes SafeERC20's safeTransfer for secure token transfer. Reverts if the contract's balance of the specified token is zero.
     * @param _beneficiary Address to which the tokens will be sent. Must not be the zero address.
     * @param _token Address of the ERC20 token to be withdrawn. Must be a valid ERC20 token contract.
     */
    function withdrawToken(
        address _beneficiary,
        address _token
    ) public onlyOwner {
        // Retrieve the balance of this contract
        uint256 amount = IERC20(_token).balanceOf(address(this));

        // Revert if there is nothing to withdraw
        if (amount == 0) revert NothingToWithdraw();

        IERC20(_token).transfer(_beneficiary, amount);
    }

}
```

You can test the contract code by following these steps：

1. Compile and deploy the DemoContract with the VerifierProxy contract address.
2. Deposit some wrapped native token to the DemoContract.
3. Use the full report obtained in the [ API& WebSocket Guide](/en/data-pull-evm-chain/api-and-websocket-guide) guide as the payload params and trigger the appropriate functions.[<br>](https://docs.apro.com/en/~/changes/iSQEVg48vDBrMW8VT6bo/data-push/price-feed-contract/nft-price-feed)


# API & WebSocket Guide

Domains

<table><thead><tr><th width="221">Description</th><th width="270">Testnet URL</th><th>Mainnet URL</th></tr></thead><tbody><tr><td>REST Endpoint to query specific reports</td><td><a href="http://live-api-test.apro.com">https://live-api-test.apro.com</a></td><td><a href="http://live-api.apro.com">https://live-api.apro.com</a></td></tr></tbody></table>

### Authentication

**Headers**

All routes require the following two headers for user authentication:

<table><thead><tr><th width="177">Header</th><th>Description</th></tr></thead><tbody><tr><td><strong>Authorization</strong></td><td>The user’s unique identifier, provided as a UUID (Universally Unique IDentifier).</td></tr><tr><td><strong>X-Authorization-Timestamp</strong></td><td>The current timestamp, with precision up to milliseconds. The timestamp must closely synchronize with the server time, allowing a maximum discrepancy of 5 seconds (by default).</td></tr></tbody></table>

### API endpoints

1. #### Return a single report at a given timestamp

**Endpoint**

> /api/v1/reports

<table><thead><tr><th width="170">Type</th><th width="199">Description</th><th>Parameter(s)</th></tr></thead><tbody><tr><td>HTTP GET</td><td>Returns a single report for a given timestamp.</td><td><ul><li><strong><code>feedID</code></strong>: A Data Streams feed ID.</li><li><strong><code>timestamp</code></strong>: The Unix timestamp for the report.</li></ul></td></tr></tbody></table>

**Sample request**

> GET /api/v1/reports?feedID=\<feedID>\&timestamp=\<timestamp>

**Sample response**

```json
{
    "report": {
        "feedID": "Hex encoded feedId.",
        "validFromTimestamp": "Report's earliest applicable timestamp (in seconds).",
        "observationsTimestamp": "Report's latest applicable timestamp (in seconds).",
        "fullReport": "A blob containing the report context and body. Encode the fee token into the payload before passing it to the contract for verification.",
        "askPrice": "Ask price.",
        "bidPrice": "Bid price.",
        "midPrice": "Mid price."
    }
}
```

<figure><img src="https://227137242-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUIpyIkxGAPXFuivFcvwB%2Fuploads%2FS1PjReQqomw6E3aAl1XR%2Fimage.png?alt=media&amp;token=773ac854-cd30-4027-b0dc-a435edc4b590" alt=""><figcaption></figcaption></figure>

2. #### Return a single report with the latest timestamp

**Endpoint**

> /api/v1/reports/latest

| Type     | Parameter(s)                          |
| -------- | ------------------------------------- |
| HTTP GET | **`feedID`**: A Data Streams feed ID. |

**Sample request**

> GET /api/v1/reports/latest?feedID=\<feedID>

**Sample response**

```json
{
    "report": {
        "feedID": "Hex encoded feedId.",
        "validFromTimestamp": "Report's earliest applicable timestamp (in seconds).",
        "observationsTimestamp": "Report's latest applicable timestamp (in seconds).",
        "fullReport": "A blob containing the report context and body. Encode the fee token into the payload before passing it to the contract for verification.",
        "askPrice": "Ask price.",
        "bidPrice": "Bid price.",
        "midPrice": "Mid price."
    }
}
```

<figure><img src="https://227137242-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUIpyIkxGAPXFuivFcvwB%2Fuploads%2F5InCUbxRp73NDntUe3rT%2Fimage.png?alt=media&amp;token=83d24f1c-70b9-4561-95e8-a99247e7bcc7" alt=""><figcaption></figcaption></figure>

3. #### Return a report for multiple FeedIDs at a given timestamp

**Endpoint**

> /api/v1/reports/bulk

<table><thead><tr><th width="139">Type</th><th width="180">Description</th><th>arameter(s)</th></tr></thead><tbody><tr><td>HTTP GET</td><td>Return a report for multiple FeedIDs at a given timestamp.</td><td><ul><li><strong><code>feedIDs</code></strong>: A comma-separated list of Data Streams feed IDs.</li><li><strong><code>timestamp</code></strong>: The Unix timestamp for the reports or the string 'latest' for getting the latest reports.</li></ul></td></tr></tbody></table>

**Sample request**

> GET /api/v1/reports/bulk?feedIDs=\<FeedID1>,\<FeedID2>,...\&timestamp=\<timestamp>
>
> GET /api/v1/reports/bulk?feedIDs=\<FeedID1>,\<FeedID2>,...\&timestamp=latest

**Sample response**

```json
{
    "reports": [
        {
            "feedID": "Hex encoded feedId.",
            "validFromTimestamp": "Report's earliest applicable timestamp (in seconds).",
            "observationsTimestamp": "Report's latest applicable timestamp (in seconds).",
            "fullReport": "A blob containing the report context and body. Encode the fee token into the payload before passing it to the contract for verification.",
            "askPrice": "Ask price.",
            "bidPrice": "Bid price.",
            "midPrice": "Mid price."
        },
      //...
    ]
}
```

<figure><img src="https://227137242-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUIpyIkxGAPXFuivFcvwB%2Fuploads%2Feg7xbh9sVU6w4E3V6tqg%2Fimage.png?alt=media&amp;token=eb89355d-434f-4fd6-b194-1fa482ef2c8f" alt=""><figcaption></figcaption></figure>

<figure><img src="https://227137242-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUIpyIkxGAPXFuivFcvwB%2Fuploads%2F2Byb14uqgv1V9dXz9BXc%2Fimage.png?alt=media&amp;token=1d11de20-4b7c-446f-8eaa-631586eb401e" alt=""><figcaption></figcaption></figure>

4. #### Return multiple sequential reports for a single FeedID, starting at a given timestamp

**Endpoint**

> /api/v1/reports/page

<table><thead><tr><th width="143">Type</th><th width="213">Description</th><th>Parameter(s)</th></tr></thead><tbody><tr><td>HTTP GET</td><td>Return multiple sequential reports for a single FeedID, starting at a given timestamp.</td><td><ul><li><strong><code>feedID</code></strong>: A Data Streams feed ID.</li><li><strong><code>startTimestamp</code></strong>: The Unix timestamp for the first report.</li><li><strong><code>limit</code></strong> (optional): The number of reports to return.</li></ul></td></tr></tbody></table>

**Sample request**

> GET /api/v1/reports/page?feedID=\<FeedID>\&startTimestamp=\<StartTimestamp>\&limit=\<Limit>

**Sample response**

```json
{
    "reports": [
        {
            "feedID": "Hex encoded feedId.",
            "validFromTimestamp": "Report's earliest applicable timestamp (in seconds).",
            "observationsTimestamp": "Report's latest applicable timestamp (in seconds).",
            "fullReport": "A blob containing the report context and body. Encode the fee token into the payload before passing it to the contract for verification.",
            "askPrice": "Ask price.",
            "bidPrice": "Bid price.",
            "midPrice": "Mid price."
        },
      //...
    ]
}
```

<figure><img src="https://227137242-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUIpyIkxGAPXFuivFcvwB%2Fuploads%2FqBLfVhlMd0GTPH1RpSeK%2Fimage.png?alt=media&amp;token=5136dc6c-870e-4dda-8972-7f17a5d95060" alt=""><figcaption></figcaption></figure>

5. #### WebSocket Connection

Establish a streaming WebSocket connection that sends reports for the given feedID(s) after they are verified.

**Endpoint**

> /api/v1/ws

<table><thead><tr><th width="261">Type</th><th>Parameter(s)</th></tr></thead><tbody><tr><td>WebSocket</td><td><strong><code>feedIDs</code></strong>: A comma-separated list of Data Streams feed IDs.</td></tr></tbody></table>

**Sample request**

> GET /api/v1/ws?feedIDs=\<feedID1>,\<feedID2>,...

**Sample response**

```json
{
  "report": {
    "feedID": "hex encoded feedId",
    "fullReport": "a blob containing the report context + body, can be passed unmodified to the contract for verification"
  }
}
```

<figure><img src="https://content.gitbook.com/content/UIpyIkxGAPXFuivFcvwB/blobs/KVcIF28n810P491AG8R5/image.png" alt=""><figcaption></figcaption></figure>

### Error response codes

<table><thead><tr><th width="215">Status Code</th><th>Description</th></tr></thead><tbody><tr><td>400 Bad Request</td><td><p>This error is triggered when:</p><ul><li>There is any missing/malformed query argument.</li><li>Required headers are missing or provided with incorrect values.</li></ul></td></tr><tr><td>401 Unauthorized User</td><td><p>This error is triggered when:</p><ul><li>Authentication fails, typically because the HMAC signature provided by the client doesn't match the one expected by the server.</li><li>A user requests access to a feed without the appropriate permission or that does not exist.</li></ul></td></tr><tr><td>500 Internal Server</td><td>Indicates an unexpected condition encountered by the server, preventing it from fulfilling the request. This error typically points to issues on the server side.</td></tr><tr><td>206 Missing data (<strong><code>/bulk</code></strong> endpoint only)</td><td>Indicates that at least one feed ID data is missing from the report. E.g., you requested a report for feed IDs <strong><code>&#x3C;feedID1></code></strong>, <strong><code>&#x3C;feedID2></code></strong>, and <strong><code>&#x3C;feedID3></code></strong> at a given timestamp. If data for <strong><code>&#x3C;feedID2></code></strong> is missing from the report (not available yet at the specified timestamp), you get <strong><code>[&#x3C;feedID1 data>, &#x3C;feedID3 data>]</code></strong> and a 206 response.</td></tr></tbody></table>


# Price Feed ID

**For a guide on how to use the APRO Data Pull, check out the Data Pull** [**Getting Started**](https://docs.apro.com/en/data-pull/getting-started)**.**

### APRO Price Feed Support Principles <a href="#apro-price-feed-support-principles" id="apro-price-feed-support-principles"></a>

APRO provides Price Feeds (**BTC/USD**, **ETH/USD**, **USDT/USD**, **USDC/USD**, **SOL/USD**) calculated based on the **median price** from multiple **authoritative data sources** to ensure **fairness** and **stability**.

APRO provides RWA Feeds calculated based on the **median price** from multiple **authoritative data sources** to ensure **fairness** and **stability**.

**Data Source Overview**\
Our data sources include globally leading exchanges and professional financial data providers, such as:

* Coinbase
* Binance
* OKEx
* Bybit
* HTX
* KuCoin
* Gate.io
* MEXC
* Tiingo
* New Change FX
* All Tick
* Alpha Vantage
* Finn Hub
* Market Stack
* Polygon

**Data Processing Methodology**\
To maximize data reliability, we adhere to the principle of median price calculation, eliminating outliers and invalid data to ensure that price feeds are not influenced by extreme values.


# On-Chain Costs

Each time data is published on-chain via the **Data Pull** model, **gas fees** and **service fees** are required to be covered. To enhance the user experience, APRO may offer temporary discounts or promotions based on the gas fee dynamics of different blockchains.

**For more information on on-chain costs, please contact us via:**

* Email: <bd@apro.com>
* Telegram: [Head of Business Development](https://t.me/Annie_LLLEEE)

**You can pay service fees using the following tokens:**&#x20;

* **Native blockchain gas tokens** and their **ERC20-wrapped** versions.

**Cost Responsibility in Data Pull Models**

In most data pull-based models, including APRO's, it is typical for on-chain costs to be passed onto the end users when they request data during transactions. This ensures efficient and flexible cost management in decentralized applications.


# FAQ

### 1. How does APRO work?

<figure><img src="https://lh7-us.googleusercontent.com/OZuRqPJlndC2ub5O4RCeR_Yb9igp_eMSr_pGWeTkIxzAeJPndkbvhS-YmW0CKlOAMIwzFXesfrFmr5XJw0eC1L41DnW5R4NNIYZTUhPFiCMG5kyGfQgX32t8818R-LKkyUUG0RuCFIaygzvYuDI6yMI" alt=""><figcaption></figcaption></figure>

Apro has established a two-tier oracle network. The first tier is called OCMP (off chain message protocol) network, which is the oracle network itself, consisting of the network's nodes. The second tier is Eigenlayer network as the backstop tier. Once the arguments happen between customers and OCMP aggregator, the Eigenlayer AVS Operators with strong historical reliability scores or more security network than the first tier will do the fraud validation.

The first tier is the participant of the ecosystem, while the second tier is the adjudicator of the ecosystem. Adjudicators do not have the power to judge simply because of their higher status, but because of their past historical data performance or the security of ETH, they are more credible.

The nodes in the initial tier monitor each other and can report to the backstop tier in case of large-scale anomalies, where the nodes of the backstop tier make judgments. The two-tier network adds an arbitration committee that comes into effect at critical moments, reducing the risk of majority bribery attacks on nodes by partially sacrificing decentralization.

Staking is similar to a margin system. Nodes need to deposit two parts of the margin (deposits): the first part of the margin will be forfeited (slashed) for reporting data different from the majority, and the second part of the margin will be forfeited for faulty escalation to the second-tier network.

In addition to nodes, users can also challenge the behavior of nodes by staking deposits. Through the user challenge mechanism, APRO incorporates users and the community into the ecosystem's security system, allowing not only mutual supervision and reporting among nodes but also supervision from outside the nodes.

The OCMP process:

<figure><img src="https://content.gitbook.com/content/UIpyIkxGAPXFuivFcvwB/blobs/mWIqqBTuAiJ9MVcaDN2d/photo_6226417241973439987_y.jpeg" alt=""><figcaption></figcaption></figure>

### 2. What is a blockchain oracle?

A blockchain oracle is a bridge that connects a blockchain with external systems, allowing smart contracts to access and interact with data from the outside world. Oracles are essential for enabling blockchains to interact with real-world events, information, and conditions that are not natively accessible on the blockchain.

Oracles can provide various types of data to smart contracts, such as price feeds for cryptocurrencies or traditional assets, weather data, election results, and more. They can also enable blockchains to trigger actions in external systems, such as sending a payment or updating a database.

However, oracles introduce a level of trust into the otherwise trustless environment of a blockchain. Since smart contracts rely on the data provided by oracles, the security, reliability, and accuracy of the oracle become critical. Different approaches exist to address these challenges, such as decentralized oracles, which distribute the data sourcing and validation process across multiple nodes to reduce the risk of manipulation or errors.

### 3. Why do blockchains need oracles?

The world of blockchain  and the real world are two completely separate worlds. Blockchain systems can be viewed as deterministic systems, where all nodes follow the same rules and protocols to execute transactions and reach consensus. In this process, each node performs deterministic operations, meaning that for the same input data, all nodes will get the same output results. This deterministic operation ensures the effectiveness and security of the decentralized consensus process.

However, when it comes to receiving external data, the situation becomes uncertain. Since external data may vary due to differences in sources, timing, and other factors, individual nodes may face uncertain operations when obtaining and processing external data. This uncertain operation may lead to data inconsistency between nodes, thereby affecting the consensus process, so the blockchain itself cannot actively obtain data from external sources.

Although blockchain has revolutionary potential in many aspects, especially programmable blockchains like Ethereum, if it remains a closed system without links to the outside world, it cannot realize its full value, just like a computer that is not connected to the Internet. Only by truly revitalizing blockchain technology and connecting it with the external world, allowing on-chain smart contracts to access and respond to real-world data, can smart contracts be truly applied in reality, and Web3 can truly reach the masses.

The oracle is responsible for connecting the blockchain and the real world, thereby achieving data interoperability between the blockchain and the real world. Oracles are responsible for securely, accurately, and credibly introducing external data into the blockchain system. Through oracles, blockchain systems can obtain and utilize external data while maintaining deterministic operations, thereby enabling a broader range of applications and functions.

### 4. What is a decentralized oracle network?

A decentralized oracle network (DON) is a system that aims to provide reliable and secure external data to smart contracts on a blockchain in a decentralized manner. Unlike a centralized oracle, which relies on a single source or entity for data, a decentralized oracle network aggregates data from multiple sources and uses consensus mechanisms to ensure the accuracy and integrity of the data provided to the blockchain.

Key features of a decentralized oracle network include:

* **Decentralization:** The network consists of multiple independent oracle nodes, reducing the risk of a single point of failure or manipulation.
* **Consensus Mechanism:** Oracle nodes collectively agree on the data to be provided to the blockchain, ensuring that the data is accurate and reliable.
* **Incentive Structure:** Oracle nodes are often rewarded for providing accurate data and penalized for providing false or inaccurate data, encouraging honesty and reliability.
* **Data Aggregation:** Data from various sources is aggregated to form a more accurate and comprehensive dataset.
* **Security:** Mechanisms are in place to protect against malicious actors and ensure the integrity of the data.

Decentralized oracle networks play a crucial role in enabling smart contracts to interact with real-world data and events in a trustless and secure manner, thereby expanding the potential applications of blockchain technology.&#x20;

### 5. What makes the APRO oracle network more reliable than other oracle networks?

Service stability: with Eigenlayer

RPC stability: High available RPC node

Dao voted market

Price security: TVWAP

![](https://lh7-us.googleusercontent.com/SrPTqjVJpjXfgLDh9Xg9MMD6vEjCs2Gy1YbZ16PTVnExynH2RY6pJ3xM8kJLIZ9pIlxd40k0ELEOdl8BiMU4S6ynBTyc5NYdtcld-sM-e1KAvLnUwUo1Rpwp3Z4Djww0PW2AXPlK0IM-T_ZRqUgZXjo)

Network Security: OCMP


# Developer Responsibilities

Market Integrity and Application code Risks

Apro Data Feeds provide access to highly secure, reliable, and decentralized real-world data published onchain. The assets priced by Apro Data Feeds are subject to market conditions beyond the ability of Apro node operators to control, as such developers are responsible for ensuring that the operation and performance of Apro Data Feeds match expectations.When integrating Apro Data Feeds, developers must understand that the performance of feeds is subject to risks associated with both market integrity and application code.

* Market Integrity Risks are those associated with external market conditions impacting price behavior and data quality in unanticipated ways. Developers are solely responsible for monitoring and mitigating any potential market integrity risks.
* Application Code Risks are those associated with the quality, reliability, and dependencies of the code on which an application operates. Developers are solely responsible for monitoring and mitigating any potential application code risks.

<br>

### Developer Responsibilities

Developers are responsible for maintaining the security and user experience of their applications. They must also securely manage all interactions between their applications and third-party services.In particular, developers implementing Apro Data Feeds in their code and applications are responsible for their application's market integrity and code risks that may cause unanticipated pricing data behavior. These are described below in more detail.<br>

#### Market Integrity Risks

Market conditions can impact the pricing behavior of assets in ways beyond the ability of Apro node operators to predict or control.Market integrity risk factors can include but are not limited to, market manipulation such as Spoofing, Ramping, Bear Raids, Cross-Market Manipulation, Washtrading, and Frontrunning. All assets are susceptible to market risk, but in particular, assets with high market risk, such as those with low liquidity, are the most vulnerable to market manipulation. Developers are solely responsible for accounting for such risk factors when integrating Apro Data Feeds into their applications. Developers should understand the market risks around the assets they intend their application to support before integrating associated Apro Data Feeds and inform their end users about applicable market risks.Developers should reference the following additional information when implementing Apro Data Feeds:

* Data Feed Categories to evaluate market integrity risks associated with specific Apro Data Feeds Developers intend to integrate.
* Evaluating Data Source Risks to evaluate risk mitigation techniques associated with Apro Data Feeds broadly.

#### Application Code Risks

Developers implementing Apro Data Feeds are solely responsible for instituting the requisite risk mitigation processes including, but not limited to, data quality checks, circuit breakers, and appropriate contingency logic for their use case.

* Code quality and reliability: Developers must execute code using Apro Data Feeds only if the code meets the quality and reliability requirements for their use case and application.
* Code and application audits: Developers are responsible for auditing their code and applications before deploying to production. Developers must determine the quality of any audits and ensure that they meet the requirements for their application.
* Code dependencies and imports: Developers are responsible for ensuring the quality, reliability, and security of any dependencies or imported packages that they use with Apro Data Feeds, and review and audit these dependencies and packages.<br>

###


# Terms of Use

By accessing this website and any materials presented herein (the “Site”), you agree to the following terms and conditions pertaining to the use of the Site. APRO Data Association and its subsidiaries and affiliates (collectively, “APRO”) reserve the right to change the terms, conditions, and notices under which this Site is offered without notice at any time. Each use of the Site constitutes your agreement to be bound by the then-current terms and conditions set forth in these Terms of Use. The Terms of Use incorporate the Data Protection and Privacy Policy.

&#x20;

### LIMITED LICENSE

&#x20;

Nothing contained in these Terms of Use or the Site itself grants or will be construed to grant to you or any third party any title or interest in or any license or right to use or reproduce, any image, text, software, code, trademark, logo, or service mark contained in the Site, including without limitation the names or logos of APRO. APRO reserves, and will enforce to the fullest extent possible, all rights that it may have with respect to copyright and trademark ownership of all material contained in the Site. APRO grants you a limited, nonexclusive license to display and otherwise use portions of the Site solely for your own private, non-commercial informational purposes only, and to print pages from the Site only in connection with that use. You may not modify, distribute, transmit, perform, reproduce, publish, license, create derivative works from, transfer, or sell any text, graphics, logos, and other source-identifying symbols, designs, icons, images, or other information, software, or code obtained from the Site.

&#x20;

### NO WARRANTY

&#x20;

APRO AND ITS RESPECTIVE OFFICERS, MANAGERS, DIRECTORS, PRINCIPALS, AGENTS, AND EMPLOYEES MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING THE ACCURACY, RELIABILITY, COMPLETENESS, SUITABILITY, OR OTHER CHARACTERISTICS OF THE INFORMATION AND MATERIALS CONTAINED ON OR PRESENTED THROUGH THE SITE. ANY CONTENT OF THE SITE IS SUBJECT TO CHANGE WITHOUT NOTICE. ALL SUCH INFORMATION AND MATERIALS ARE PROVIDED “AS IS”, WITHOUT ANY WARRANTY OF ANY KIND. APRO HEREBY FURTHER DISCLAIMS ALL WARRANTIES AND CONDITIONS WITH REGARD TO SUCH INFORMATION AND MATERIALS, INCLUDING ALL IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, NON-INFRINGEMENT, AND AVAILABILITY.

&#x20;

### LIMITATION OF LIABILITY

&#x20;

IN NO EVENT SHALL APRO, AND ITS RESPECTIVE OFFICERS, MANAGERS, DIRECTORS, PRINCIPALS, AGENTS, AND EMPLOYEES BE LIABLE FOR ANY CLAIMS, LIABILITIES, LOSSES, COSTS, OR DAMAGES, INCLUDING DIRECT, INDIRECT, PUNITIVE, INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, ARISING OUT OF OR IN ANY WAY CONNECTED WITH (I) THE USE OF OR INABILITY TO USE THE SITE OR WITH ANY DELAY IN USING THE SITE, OR (II) ANY INFORMATION AND MATERIALS OBTAINED THROUGH THE SITE, OR (III) OTHERWISE ARISING OUT OF THE USE OF THE SITE; IN ANY CASE WHETHER BASED ON THEORIES ARISING IN CONTRACT, TORT, STRICT LIABILITY, OR OTHERWISE. SUCH LIMITATIONS APPLY EVEN IF APRO OR ANY OF ITS RESPECTIVE OFFICERS, DIRECTORS, PRINCIPALS, AGENTS, OR EMPLOYEES HAVE BEEN ADVISED OF THE POSSIBILITY OF DAMAGES.

&#x20;

### GENERAL

&#x20;

If any provision of these Terms of Use is held to be invalid or unenforceable in any jurisdiction, then such provision shall be deemed modified to the minimum extent necessary so that such provision shall no longer be held to be invalid or unenforceable, and these Terms of Use shall be interpreted so as to achieve the intent expressed herein to the greatest extent possible in the jurisdiction in question. Any such modification, invalidity, or unenforceability shall be strictly limited both to such provision and to such jurisdiction.

&#x20;

### INTELLECTUAL PROPERTY

&#x20;

APRO owns intellectual property rights associated with the APRO Network and certain other products (the “Products”). APRO protects and maintains such intellectual property rights with the intent only to use such rights defensively, such as to protect the integrity of the Products and to ensure end users have clarity and certainty. Where appropriate, APRO will make the Products open to the community under open source licenses and pursuant to permissive brand use guidelines. Protecting IP rights in this capacity and making them available in this manner will enable the community to contribute to the ecosystem around each of the Products while not requiring that APRO play a central role in ongoing development, operation, and maintenance.

### **ELECTRONIC NOTICES**

You consent to receive all communications, agreements, documents, receipts, notices, and disclosures electronically (collectively, our “**Communications**”) that we provide in connection with these Terms or any Services. You agree that we may provide our Communications to you by posting them on the Website or through the Services or by emailing them to you at the email address you provide in connection with using the Services. You should maintain copies of our Communications by printing a paper copy or saving an electronic copy. You may also contact our support team to request additional electronic copies of our Communications by filing a support request at <support@apro.com>.

### **EXCLUSION OF CONSEQUENTIAL AND RELATED DAMAGES**

In no event will the Foundation, together with any Protected Party, be liable for any incidental, indirect, special, punitive, exemplary, consequential or similar damages or liabilities whatsoever (including, without limitation, damages for loss of data, information, revenue, goodwill, profits or other business or financial benefit) arising out of or in connection with the Website, the Services and the Chainlink Network (and any of their content and functionality), any execution or settlement of a transaction, any performance or non-performance of the Services, your Distributed Ledger Technology assets, other digital assets, Link Tokens or any other product, service or other item provided by or on behalf of a Protected Party, whether under contract, tort (including negligence), civil liability, statute, strict liability, breach of warranties, or under any other theory of liability, and whether or not any Protected Party has been advised of, knew of or should have known of the possibility of such damages and notwithstanding any failure of the essential purpose of these Terms or any limited remedy nor is the Foundation in any way responsible for the execution or settlement of transactions between users of Apro open-source software or the Apro Network.

### **LIMITATION OF LIABILITY**

In no event will the Protected Parties' aggregate liability arising out of or in connection with the Website, the Services and the Chainlink Network (and any of their content and functionality), any performance or non-performance of the Services, your Distributed Ledger Technology assets, other digital assets, Link Tokens or any other product, service or other item provided by or on behalf of a Protected Party, whether under contract, tort (including negligence), civil liability, statute, strict liability or other theory of liability exceed the amount of fees paid by you to us under these Terms in the twelve (12) month period immediately preceding the event giving rise to the claim for liability.

### **GOVERNING LAW**

The interpretation and enforcement of these Terms, and any dispute related to these Terms, the Website or the Services, will be governed by and construed and enforced in accordance with the laws of the British Virgin Islands, as applicable, without regard to conflict of law rules or principles (whether of the British Virgin Islands or any other jurisdiction) that would cause the application of the laws of any other jurisdiction. You agree that we may initiate a proceeding related to the enforcement or validity of our intellectual property rights in any court having jurisdiction. With respect to any other proceeding that is not subject to arbitration under these Terms, the courts located in the British Virgin Islands will have exclusive jurisdiction. You waive any objection to venue in any such courts.


# Privacy Policy

&#x20;The APRO Data Association (“APRO”) with registered office at \[BVI], respects the privacy of Personal Data and is committed to protecting Personal Data. This Data Protection and Privacy Policy (this “Policy”) describes the policies and procedures APRO has implemented to protect Personal Data Processed by APRO in accordance with applicable Data Protection Laws.

&#x20;

APRO has voluntarily opted to apply the protections and obligations outlined in this Policy to all Data Subjects. However, such protections and obligations may be beyond the legal requirements of the jurisdiction of certain Data Subjects. Data Protection Laws vary widely across jurisdictions and while APRO will strive to meet this Policy for all Data Subjects, the Data Protection Laws for the Data Subject ultimately govern the protections conferred in the specific jurisdiction applicable to that Data Subject, and this Policy does not confer any rights beyond those granted by the relevant Data Protection Laws.

&#x20;

This Policy describes how APRO collects and uses Personal Data, the circumstances under which APRO may share Personal Data, the applicable rights of Data Subjects, and APRO’s technical and physical safeguards to protect the security of Personal Data.

&#x20;

### DEFINITIONS

&#x20;

“Controller” means a natural or legal person, public authority, agency, or other body that, independently or jointly with others, determines the purpose and means of Processing Personal Data, as defined in Data Protection Laws. Controller shall refer to APRO, and with regard to certain processes, APRO may act as joint Controller with a third-party.

&#x20;

“Data Protection Laws” refer to applicable privacy legislations, regulations, or codes issued by data protection regulators.

&#x20;

“Data Subject” means a natural person who can be identified, directly or indirectly, by reference to their Personal Data.

&#x20;

“Personal Data” means any information attributable to an identified or identifiable natural person (a Data Subject), as defined in Data Protection Laws. Personal Data does not include data where the identity has been removed (anonymous data). Personal Data shall encompass Special Category Data.

&#x20;

“Process” or “Processing” or “Processed” or “Processes” means, as applicable, any operation or set of operations performed upon Personal Data, whether or not by automatic means.

&#x20;

“Processor” means a natural or legal person, public authority, agency, or other body that Processes Personal Data on behalf of a Controller, as defined in Data Protection Laws.

&#x20;

“Special Category Data” means Personal Data revealing racial or ethnic origin, criminal history, political opinions, religious or philosophical beliefs, sexual orientation, trade union membership, or health, genetic, or biometric data, or data pertaining to a child or minor.

&#x20;

### A. GENERAL DATA PROTECTION INFORMATION

&#x20;

### DATA PROTECTION PRINCIPLES

&#x20;

APRO is committed to processing data in accordance with its responsibilities under the Data Protection Laws, and in particular with the following principles:

&#x20;

\- Fair, lawful and transparent processing;

\- Collection for specified, explicit and legitimate purposes and no further processing in a manner that is incompatible with the specified purposes;

\- Limitation to what is adequate, relevant and necessary in relation to the purposes for which the Personal Data is processed;

\- Keep Personal Data accurate and up to date;

\- Keep Personal Data only for as long as it is necessary or legally required;

\- Process Personal Data in a manner that ensures appropriate security, including protection against unauthorized or unlawful processing and against accidental loss, destruction or damage;

\- Process Personal Data in accordance with the rights of the Data Subject;

\- Ensure an adequate level of data protection when transferring Personal Data to a country outside of the European Economic Area.

&#x20;

### LEGAL BASIS FOR PROCESSING PERSONAL DATA

&#x20;

APRO will only use Personal Data when Data Protection Laws allow APRO to do so. Personal Data shall be Processed in a manner that is adequate, relevant, and not excessive in relation to the intended business purpose(s) of such Processing. A legal basis is required to process Personal Data. Personal Data may be processed only if at least one of the following legal bases applies:

&#x20;

1\. Consent: Data Subject giving consent to the Processing of his or her Personal Data for a specific purpose(s);

2\. Contractual necessity: Processing is necessary for the performance of a contract to which the Data Subject is party or entering into a contract;

3\. Compliance with legal obligations: Processing is necessary for compliance with a legal obligation to which APRO is subject;

4\. Vital interests: Processing is necessary in order to protect the vital interests of the Data Subject or of another natural person;

5\. Public interests: Processing is permitted if it is necessary for the performance of a task carried out in the public interest;

6\. Legitimate interests: Processing is necessary for the purposes of the legitimate interests pursued by APRO or a third party, except where such interests are overridden by the interests or fundamental rights and freedoms of the Data Subject which require protection of Personal Data.

&#x20;

### RIGHTS OF DATA SUBJECTS

&#x20;

When applicable, APRO shall honor Data Subject rights, as described herein. In accordance with Data Protection Laws and in certain circumstances, a Data Subject may possess the right to:

&#x20;

1\. Request access to his or her Personal Data that APRO holds to check that it is accurately and lawfully being processed;

2\. Request correction of his or her Personal Data that APRO holds;

3\. Request erasure of his or her Personal Data;

4\. Object to Processing of his or her Personal Data where APRO relies on a legitimate interest (or those of a third party);

5\. Request restriction of Processing of his or her Personal Data;

6\. Request the transfer of his or her Personal Data;

7\. Withdraw consent at any time where APRO relies on consent to Process Personal Data;

8\. Be notified of a data breach involving a Data Subject's Personal Data.

&#x20;

APRO shall accept, when applicable, any written requests through the appropriate channels from a Data Subject to exercise his or her rights and freedoms pursuant to Data Protection Laws. APRO shall use reasonable means to verify the identity of the requester.

&#x20;

### APRO DATA PROTECTION OBLIGATIONS

&#x20;

APRO and its Personnel have implemented appropriate technical and organizational measures to provide adequate protection regarding Data Subjects’ rights and the lawful, fair, and transparent Processing of Personal Data, as described herein. APRO data protection obligations include the following:

&#x20;

1\. Consent: When consent is the lawful basis for Processing, APRO shall obtain the affirmative consent of a Data Subject prior to such Processing;

2\. Purpose Limitation: APRO shall restrict the Processing of Personal Data to the intended business purpose(s);

3\. Notification: APRO shall provide notification in clear language to a Data Subject at the outset of Processing;

4\. Access: Upon request by a Data Subject, APRO shall provide such Data Subject with access to his or her Personal Data in the possession or under the control of APRO;

5\. Correction: Upon request by a Data Subject, APRO shall correct any error or omission in a Data Subject’s Personal Data in the possession or under the control of APRO;

6\. Erasure: Upon request by a Data Subject, APRO shall erase such Data Subject’s Personal Data in the possession or under the control of APRO;

7\. Accuracy: APRO shall make a reasonable effort to verify that Personal Data Processed by or on behalf of APRO is accurate and complete;

8\. Protection: APRO shall protect Personal Data in its possession or under its control by securing against unauthorized Processing;

9\. Retention: Personal Data will be retained for as long as is necessary for the intended purpose;

10\. Breach Notification: In the case of a data breach, APRO shall notify the supervisory or data protection authorities within seventy-two (72) hours.

&#x20;

### SHARING OF PERSONAL DATA

&#x20;

APRO may share Personal Data with third-parties to Process (maintain, store, use) on APRO’s behalf. APRO requires all such Processors to take appropriate security measures to protect Personal Data in accordance with APRO’s policies. APRO does not allow Processors to Process Personal Data for their own purposes and only permits them to Process Personal Data for specified purposes and in accordance with APRO's instructions.

&#x20;

APRO may share Personal Data with third parties to Process on their own behalf. Such third parties will be considered joint-Controllers of such Personal Data. While joint-Controllers have shared discretion over the purposes of Processing, all such Controllers agree to Process such shared Personal Data in accordance with Data Protection Laws.

&#x20;

### TRANSFER OF PERSONAL DATA ABROAD

&#x20;

APRO may transfer your Personal Data to third-parties based abroad for the purposes of the data processing described in this Policy. Such third-parties are obliged to protect the privacy of individuals to the same extent as APRO does. If the level of data protection in a country does not correspond to the Swiss or European level, APRO contractually ensures that the protection of your Personal Data corresponds to that in Switzerland or the EU at all times.

&#x20;

### SECURITY MEASURES TAKEN TO PROTECT PERSONAL DATA

&#x20;

APRO has implemented appropriate elements of privacy by design in conjunction with technical and physical safeguards to protect the security of Personal Data from unauthorized or unlawful Processing. APRO uses a number of systems and applications to protect Personal Data at all times, which also allow for the following capabilities: the anonymization and encryption of Personal Data; the ability to ensure the ongoing confidentiality, integrity, availability, and resilience of Processing Personal Data; the ability to restore the availability and access to Personal Data in a timely manner in the event of a physical or technical incident; and a process for regularly testing, assessing, and evaluating, at least annually, the effectiveness of such security measures.

&#x20;

### THIRD PARTY WEBSITES AND SOCIAL MEDIA

&#x20;

This website may contain content and links to third-party websites that are not owned, operated, or controlled by APRO. APRO is not responsible for the privacy practices of or the content displayed on such third-party websites.

&#x20;

When engaging with APRO’s content on or through a third-party social networking website, plug-in, or application, APRO may Process Personal Data associated with your social media account.

&#x20;

### B. SCOPE AND PURPOSE OF COLLECTION, PROCESSING, AND USE OF PERSONAL DATA WHEN VISITING OUR WEBSITES

&#x20;

When you visit our websites, our servers temporarily save each access in a log file. The following data may be collected without your intervention and stored by APRO until deletion, as is necessary in compliance with applicable laws:

&#x20;

\- the IP address of the requested computer;

\- the name of your internet access provider (usually your internet access provider);

\- the date and time of access;

\- the name and URL of the retrieved file;

\- the page and address of the website from which you were redirected to the website and, if applicable, the search term used;

\- the country from which the website is accessed;

\- the operating system of your computer and the browser you are using (provider, version and language); and

\- the transmission protocol used (e.g. HTTP/1.1).

&#x20;

The collection and processing of this data is carried out for the purpose of enabling the use of the website (connection establishment), to permanently guarantee system security and stability and to enable the optimization of our internet offer as well as for internal statistical purposes.

&#x20;

### IF YOU CONTACT US BY E-MAIL

&#x20;

On the website you have the possibility to contact APRO or one of its experts by e-mail. You can also contact APRO for support questions by e-mail.

&#x20;

You are responsible for the message and/or transmitted content that you send to APRO. APRO recommends that you do not send any confidential data. Personal Data is only collected if you provide it to APRO voluntarily.

&#x20;

### WHEN YOU APPLY FOR A JOB

&#x20;

If you submit a letter of application by e-mail, APRO processes the Personal Data you provide in order to check your application and, if necessary, to contact you in this context.

&#x20;

### WHEN YOU APPLY AS DATA PROVIDER

&#x20;

When you apply as an APRO Data Provider, you may have to enter the following information into the online application form:

&#x20;

\- E-mail;

\- Company;

\- First Name;

\- Last Name;

\- Street;

\- Zip;

\- City; and

\- Country.

&#x20;

COOKIES, SCRIPTS AND RELATED TECHNOLOGIES

&#x20;

When you visit this website, APRO and its third-party service providers receive and record Personal Data that you may have provided and your digital signature, such as your IP address.

&#x20;

### TRACKING TOOLS

&#x20;

Google Analytics

&#x20;

We use Google Analytics, a web analytics service provided by Google Ireland Limited or Google Inc. Google Analytics uses methods that enable an analysis of the use of the website, such as cookies.

&#x20;

Google Tag Manager

&#x20;

We use Google Tag Manager, a service of Google Ireland Limited or Google Inc. to manage cookies and pixels for tracking tools and other tools.

&#x20;

Cloudflare Insights

&#x20;

We use the website functions from Cloudflare. Cloudflare offers a globally distributed content delivery network with DNS.

&#x20;

### ADOBE TYPEKIT

&#x20;

This website uses so-called web fonts provided by Adobe Typekit for the uniform display of fonts.

&#x20;

### LINKS TO OUR SOCIAL MEDIA PRESENCES

&#x20;

On the website, we have set up links to our social media presences on the following social networks.

&#x20;

### REVIEW AND UPDATES TO POLICY

&#x20;

APRO will review and may update this Policy to reflect changes to APRO’s privacy practices or security measures as needed.

&#x20;

### CONTACT

&#x20;

Please contact APRO by email at \[<support@apro.com>] hould you have any questions or comments about this Policy or your Personal Data.

<br>


# Node operator

<table><thead><tr><th>Logo</th><th width="216.33333333333331">Company Name</th><th>Link</th></tr></thead><tbody><tr><td><img src="https://content.gitbook.com/content/UIpyIkxGAPXFuivFcvwB/blobs/8a0nKQzCIIBcBy7Ghdxe/logo.png" alt="" data-size="original"></td><td><strong>UXUY</strong></td><td><a href="https://uxuy.com/">https://uxuy.com/</a></td></tr><tr><td><img src="https://content.gitbook.com/content/UIpyIkxGAPXFuivFcvwB/blobs/rTkCLTDqf2YvUUVGP7KD/highlight.png" alt="" data-size="original"></td><td><strong>Highlight</strong></td><td></td></tr><tr><td><img src="https://content.gitbook.com/content/UIpyIkxGAPXFuivFcvwB/blobs/6nztzsspflSHqULTJmDP/ABCDE.jpeg" alt="" data-size="original"></td><td><strong>ABCDE</strong></td><td><a href="https://www.abcde.com/">https://www.abcde.com/</a></td></tr><tr><td><img src="https://content.gitbook.com/content/UIpyIkxGAPXFuivFcvwB/blobs/rahJZsXvnOcfChGl5AyK/image.png" alt="" data-size="original"></td><td><strong>BeWater</strong></td><td><a href="https://t.co/fKYlAXm628">bewater.xyz</a></td></tr></tbody></table>


# APRO VRF

**APRO VRF: Verifiable Random Function**

As a randomness engine for **Web3 infrastructure**, APRO VRF is built on an independently optimized **BLS threshold signature algorithm**, featuring a **layered dynamic verification architecture**. By employing a **two-stage separation mechanism**—"distributed node pre-commitment" and "on-chain aggregated verification"—APRO VRF enhances **response efficiency by 60%** compared to traditional VRF solutions, while ensuring **unpredictability** and **full lifecycle auditability** of random outputs.

#### **Key Technical Innovations**

* **Dynamic Node Sampling**: Adjusts the number of participating nodes based on real-time network load, balancing **security and gas costs**.
* **EVM-Native Acceleration**: Optimizes verification data compression, reducing **on-chain verification overhead by 35%**.
* **MEV-Resistant Design**: Uses **timelock encryption** to prevent **front-running attacks**.

**Industry-Grade Use Cases**

* **Fair randomness** in Play-to-Earn games
* **DAO governance** committee selection
* **On-chain liquidation protection** for derivatives
* **Immutable genetic traits** for dynamic NFTs

#### **Developer-Friendly Architecture**

* **Unified Access Layer**\
  Supports **Solidity/Vyper**, enabling **smart contract integration in under 5 minutes**.
* **Non-Currency Settlement**\
  APRO VRF uses **Valueless\_Test** as a **utility token** with **no secondary market value**.

**Now integrated with EVM chains**, APRO VRF offers **customized integration** via an **interactive console** with **real-time tracking and debugging**.


# Integration Guide

### **1. Deploy Your Own VRFConsumerV2 Contract**

The deployment parameters can be obtained from our official website:\
🔗 [APRO VRF Portal](https://www.apro.com/vrf)

#### **Supported Chains**

[**Bsc**](#id-6.1-bsc-mainnet)

#### **Steps to Deploy**

* Deploy your own VRFConsumerV2 contract

First, copy the contract code as follows to your local machine\
File 1 of 4 : LinkTokenInterface.sol

```
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface LinkTokenInterface {
  function allowance(address owner, address spender) external view returns (uint256 remaining);

  function approve(address spender, uint256 value) external returns (bool success);

  function balanceOf(address owner) external view returns (uint256 balance);

  function decimals() external view returns (uint8 decimalPlaces);

  function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);

  function increaseApproval(address spender, uint256 subtractedValue) external;

  function name() external view returns (string memory tokenName);

  function symbol() external view returns (string memory tokenSymbol);

  function totalSupply() external view returns (uint256 totalTokensIssued);

  function transfer(address to, uint256 value) external returns (bool success);

  function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool success);

  function transferFrom(address from, address to, uint256 value) external returns (bool success);
}

```

File 2 of 4 : VRFCoordinatorV2Interface.sol

```
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface VRFCoordinatorV2Interface {
  /**
   * @notice Get configuration relevant for making requests
   * @return minimumRequestConfirmations global min for request confirmations
   * @return maxGasLimit global max for request gas limit
   * @return s_provingKeyHashes list of registered key hashes
   */
  function getRequestConfig() external view returns (uint16, uint32, bytes32[] memory);

  /**
   * @notice Request a set of random words.
   * @param keyHash - Corresponds to a particular oracle job which uses
   * that key for generating the VRF proof. Different keyHash's have different gas price
   * ceilings, so you can select a specific one to bound your maximum per request cost.
   * @param subId  - The ID of the VRF subscription. Must be funded
   * with the minimum subscription balance required for the selected keyHash.
   * @param minimumRequestConfirmations - How many blocks you'd like the
   * oracle to wait before responding to the request. See SECURITY CONSIDERATIONS
   * for why you may want to request more. The acceptable range is
   * [minimumRequestBlockConfirmations, 200].
   * @param callbackGasLimit - How much gas you'd like to receive in your
   * fulfillRandomWords callback. Note that gasleft() inside fulfillRandomWords
   * may be slightly less than this amount because of gas used calling the function
   * (argument decoding etc.), so you may need to request slightly more than you expect
   * to have inside fulfillRandomWords. The acceptable range is
   * [0, maxGasLimit]
   * @param numWords - The number of uint256 random values you'd like to receive
   * in your fulfillRandomWords callback. Note these numbers are expanded in a
   * secure way by the VRFCoordinator from a single random value supplied by the oracle.
   * @return requestId - A unique identifier of the request. Can be used to match
   * a request to a response in fulfillRandomWords.
   */
  function requestRandomWords(
    bytes32 keyHash,
    uint64 subId,
    uint16 minimumRequestConfirmations,
    uint32 callbackGasLimit,
    uint32 numWords
  ) external returns (uint256 requestId);

  /**
   * @notice Create a VRF subscription.
   * @return subId - A unique subscription id.
   * @dev You can manage the consumer set dynamically with addConsumer/removeConsumer.
   * @dev Note to fund the subscription, use transferAndCall. For example
   * @dev  LINKTOKEN.transferAndCall(
   * @dev    address(COORDINATOR),
   * @dev    amount,
   * @dev    abi.encode(subId));
   */
  function createSubscription() external returns (uint64 subId);

  /**
   * @notice Get a VRF subscription.
   * @param subId - ID of the subscription
   * @return balance - LINK balance of the subscription in juels.
   * @return reqCount - number of requests for this subscription, determines fee tier.
   * @return owner - owner of the subscription.
   * @return consumers - list of consumer address which are able to use this subscription.
   */
  function getSubscription(
    uint64 subId
  ) external view returns (uint96 balance, uint64 reqCount, address owner, address[] memory consumers);

  /**
   * @notice Request subscription owner transfer.
   * @param subId - ID of the subscription
   * @param newOwner - proposed new owner of the subscription
   */
  function requestSubscriptionOwnerTransfer(uint64 subId, address newOwner) external;

  /**
   * @notice Request subscription owner transfer.
   * @param subId - ID of the subscription
   * @dev will revert if original owner of subId has
   * not requested that msg.sender become the new owner.
   */
  function acceptSubscriptionOwnerTransfer(uint64 subId) external;

  /**
   * @notice Add a consumer to a VRF subscription.
   * @param subId - ID of the subscription
   * @param consumer - New consumer which can use the subscription
   */
  function addConsumer(uint64 subId, address consumer) external;

  /**
   * @notice Remove a consumer from a VRF subscription.
   * @param subId - ID of the subscription
   * @param consumer - Consumer to remove from the subscription
   */
  function removeConsumer(uint64 subId, address consumer) external;

  /**
   * @notice Cancel a subscription
   * @param subId - ID of the subscription
   * @param to - Where to send the remaining LINK to
   */
  function cancelSubscription(uint64 subId, address to) external;

  /*
   * @notice Check to see if there exists a request commitment consumers
   * for all consumers and keyhashes for a given sub.
   * @param subId - ID of the subscription
   * @return true if there exists at least one unfulfilled request for the subscription, false
   * otherwise.
   */
  function pendingRequestExists(uint64 subId) external view returns (bool);
}

```

File 3 of 4 : VRFConsumerBaseV2.sol

```
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/** ****************************************************************************
 * @notice Interface for contracts using VRF randomness
 * *****************************************************************************
 * @dev PURPOSE
 *
 * @dev Reggie the Random Oracle (not his real job) wants to provide randomness
 * @dev to Vera the verifier in such a way that Vera can be sure he's not
 * @dev making his output up to suit himself. Reggie provides Vera a public key
 * @dev to which he knows the secret key. Each time Vera provides a seed to
 * @dev Reggie, he gives back a value which is computed completely
 * @dev deterministically from the seed and the secret key.
 *
 * @dev Reggie provides a proof by which Vera can verify that the output was
 * @dev correctly computed once Reggie tells it to her, but without that proof,
 * @dev the output is indistinguishable to her from a uniform random sample
 * @dev from the output space.
 *
 * @dev The purpose of this contract is to make it easy for unrelated contracts
 * @dev to talk to Vera the verifier about the work Reggie is doing, to provide
 * @dev simple access to a verifiable source of randomness. It ensures 2 things:
 * @dev 1. The fulfillment came from the VRFCoordinator
 * @dev 2. The consumer contract implements fulfillRandomWords.
 * *****************************************************************************
 * @dev USAGE
 *
 * @dev Calling contracts must inherit from VRFConsumerBase, and can
 * @dev initialize VRFConsumerBase's attributes in their constructor as
 * @dev shown:
 *
 * @dev   contract VRFConsumer {
 * @dev     constructor(<other arguments>, address _vrfCoordinator, address _link)
 * @dev       VRFConsumerBase(_vrfCoordinator) public {
 * @dev         <initialization with other arguments goes here>
 * @dev       }
 * @dev   }
 *
 * @dev The oracle will have given you an ID for the VRF keypair they have
 * @dev committed to (let's call it keyHash). Create subscription, fund it
 * @dev and your consumer contract as a consumer of it (see VRFCoordinatorInterface
 * @dev subscription management functions).
 * @dev Call requestRandomWords(keyHash, subId, minimumRequestConfirmations,
 * @dev callbackGasLimit, numWords),
 * @dev see (VRFCoordinatorInterface for a description of the arguments).
 *
 * @dev Once the VRFCoordinator has received and validated the oracle's response
 * @dev to your request, it will call your contract's fulfillRandomWords method.
 *
 * @dev The randomness argument to fulfillRandomWords is a set of random words
 * @dev generated from your requestId and the blockHash of the request.
 *
 * @dev If your contract could have concurrent requests open, you can use the
 * @dev requestId returned from requestRandomWords to track which response is associated
 * @dev with which randomness request.
 * @dev See "SECURITY CONSIDERATIONS" for principles to keep in mind,
 * @dev if your contract could have multiple requests in flight simultaneously.
 *
 * @dev Colliding `requestId`s are cryptographically impossible as long as seeds
 * @dev differ.
 *
 * *****************************************************************************
 * @dev SECURITY CONSIDERATIONS
 *
 * @dev A method with the ability to call your fulfillRandomness method directly
 * @dev could spoof a VRF response with any random value, so it's critical that
 * @dev it cannot be directly called by anything other than this base contract
 * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method).
 *
 * @dev For your users to trust that your contract's random behavior is free
 * @dev from malicious interference, it's best if you can write it so that all
 * @dev behaviors implied by a VRF response are executed *during* your
 * @dev fulfillRandomness method. If your contract must store the response (or
 * @dev anything derived from it) and use it later, you must ensure that any
 * @dev user-significant behavior which depends on that stored value cannot be
 * @dev manipulated by a subsequent VRF request.
 *
 * @dev Similarly, both miners and the VRF oracle itself have some influence
 * @dev over the order in which VRF responses appear on the blockchain, so if
 * @dev your contract could have multiple VRF requests in flight simultaneously,
 * @dev you must ensure that the order in which the VRF responses arrive cannot
 * @dev be used to manipulate your contract's user-significant behavior.
 *
 * @dev Since the block hash of the block which contains the requestRandomness
 * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful
 * @dev miner could, in principle, fork the blockchain to evict the block
 * @dev containing the request, forcing the request to be included in a
 * @dev different block with a different hash, and therefore a different input
 * @dev to the VRF. However, such an attack would incur a substantial economic
 * @dev cost. This cost scales with the number of blocks the VRF oracle waits
 * @dev until it calls responds to a request. It is for this reason that
 * @dev that you can signal to an oracle you'd like them to wait longer before
 * @dev responding to the request (however this is not enforced in the contract
 * @dev and so remains effective only in the case of unmodified oracle software).
 */
abstract contract VRFConsumerBaseV2 {
  error OnlyCoordinatorCanFulfill(address have, address want);
  // solhint-disable-next-line chainlink-solidity/prefix-immutable-variables-with-i
  address private immutable vrfCoordinator;

  /**
   * @param _vrfCoordinator address of VRFCoordinator contract
   */
  constructor(address _vrfCoordinator) {
    vrfCoordinator = _vrfCoordinator;
  }

  /**
   * @notice fulfillRandomness handles the VRF response. Your contract must
   * @notice implement it. See "SECURITY CONSIDERATIONS" above for important
   * @notice principles to keep in mind when implementing your fulfillRandomness
   * @notice method.
   *
   * @dev VRFConsumerBaseV2 expects its subcontracts to have a method with this
   * @dev signature, and will call it once it has verified the proof
   * @dev associated with the randomness. (It is triggered via a call to
   * @dev rawFulfillRandomness, below.)
   *
   * @param requestId The Id initially returned by requestRandomness
   * @param randomWords the VRF output expanded to the requested number of words
   */
  // solhint-disable-next-line chainlink-solidity/prefix-internal-functions-with-underscore
  function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal virtual;

  // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF
  // proof. rawFulfillRandomness then calls fulfillRandomness, after validating
  // the origin of the call
  function rawFulfillRandomWords(uint256 requestId, uint256[] memory randomWords) external {
    if (msg.sender != vrfCoordinator) {
      revert OnlyCoordinatorCanFulfill(msg.sender, vrfCoordinator);
    }
    fulfillRandomWords(requestId, randomWords);
  }
}

```

File 4 of 4 : VRFConsumerV2.sol

```
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {LinkTokenInterface} from "./interfaces/LinkTokenInterface.sol";
import {VRFCoordinatorV2Interface} from "./interfaces/VRFCoordinatorV2Interface.sol";
import {VRFConsumerBaseV2} from "./VRFConsumerBaseV2.sol";

contract VRFConsumerV2 is VRFConsumerBaseV2 {
  uint256[] public s_randomWords;
  uint256 public s_requestId;
  VRFCoordinatorV2Interface internal COORDINATOR;
  LinkTokenInterface internal LINKTOKEN;
  uint64 public s_subId;
  uint256 public s_gasAvailable;

  constructor(address vrfCoordinator, address link) VRFConsumerBaseV2(vrfCoordinator) {
    COORDINATOR = VRFCoordinatorV2Interface(vrfCoordinator);
    LINKTOKEN = LinkTokenInterface(link);
  }

  function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal override {
    require(requestId == s_requestId, "request ID is incorrect");

    s_gasAvailable = gasleft();
    s_randomWords = randomWords;
  }

  function createSubscriptionAndFund(uint96 amount) external {
    if (s_subId == 0) {
      s_subId = COORDINATOR.createSubscription();
      COORDINATOR.addConsumer(s_subId, address(this));
    }
    // Approve the link transfer.
    LINKTOKEN.transferAndCall(address(COORDINATOR), amount, abi.encode(s_subId));
  }

  function topUpSubscription(uint96 amount) external {
    require(s_subId != 0, "sub not set");
    // Approve the link transfer.
    LINKTOKEN.transferAndCall(address(COORDINATOR), amount, abi.encode(s_subId));
  }

  function updateSubscription(address[] memory consumers) external {
    require(s_subId != 0, "subID not set");
    for (uint256 i = 0; i < consumers.length; i++) {
      COORDINATOR.addConsumer(s_subId, consumers[i]);
    }
  }

  function requestRandomness(
    bytes32 keyHash,
    uint64 subId,
    uint16 minReqConfs,
    uint32 callbackGasLimit,
    uint32 numWords
  ) external returns (uint256) {
    s_requestId = COORDINATOR.requestRandomWords(keyHash, subId, minReqConfs, callbackGasLimit, numWords);
    return s_requestId;
  }
}
```

* Open the contract code using Remix, as shown below.

<figure><img src="https://1420636841-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F3IkJaplyW01Y7PIftbCj%2Fuploads%2F0gVlU1PTSpjsSUIs0RP3%2Fimage.png?alt=media&amp;token=1ac9bfa1-1018-4650-8fca-4ed28160b602" alt=""><figcaption></figcaption></figure>

* Switch to the compilation tab, select the compilation version, and compile the contract code.

<figure><img src="https://1420636841-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F3IkJaplyW01Y7PIftbCj%2Fuploads%2FwbzxRpmWwY0XydPBJScB%2Fimage.png?alt=media&amp;token=679e2394-5e29-4393-b3cb-33351c195fb6" alt=""><figcaption></figcaption></figure>

* Switch to the deployment tab, select the compilation version, and link your wallet address

<figure><img src="https://1420636841-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F3IkJaplyW01Y7PIftbCj%2Fuploads%2FjsrfAIAnQMpuVTOUMs9v%2Fimage.png?alt=media&amp;token=a5954ad3-a640-4aff-936a-52b1f5468e29" alt=""><figcaption></figcaption></figure>

* In step 7 shown in the image above, enter the VRF Coordinator V2 address  and link(Valueless Token) address and then click "transact" Finally，as shown in the image, you can copy your VRFConsumerV2 contract address in step nine, which will be used later.

***

### **2. Create a Subscription**

1. Open the **VRF Subscription Manager**:\
   🔗 [Subscription Manager](https://www.apro.com/vrf)
2. Connect your wallet (top-right corner) and click **"Create Subscription"**.
3. The **Admin Address** field is auto-filled with your connected wallet address.
4. Once created, an alert will confirm the subscription, and you'll be redirected to the dashboard.
5. Locate your **Subscription ID** in the **"My Subscriptions"** list.

***

### **3. Add a Consumer**

1. On the **subscription details page**, click **"Add Consumer"**.
2. Enter the address of your **consuming contract** and confirm the addition.
3. Approve the transaction in **MetaMask** or your wallet extension.

***

### **4. Fund Your Subscription**

To fund your subscription, provide:

* Your **wallet address**
* Your **Subscription ID**

Then, contact us via:\
📧 **Email**: <bd@apro.com>\
💬 **Telegram**: **Head of Business Development**

***

### **5. Request Randomness**

#### **Call the `requestRandomness` function in the VRFConsumerV2 contract**

```solidity
solidity function requestRandomness(
    bytes32 keyHash,
    uint64 subId,
    uint16 minReqConfs,
    uint32 callbackGasLimit,
    uint32 numWords
)
```

**Example Input**

```solidity
solidity [
    0x138eb5545472d2c19c8b6fa582ce5e9b6fdc37296e9aa87e6daad34d3df1cf64,//KeyHash
    2,    // Subscription ID
    3,    // Minimum request confirmations
    100000,  // Callback gas limit
    1     // Number of random words
]
```

#### **Retrieve Randomness**

Call the **`s_randomWords`** function in the **VRFConsumerV2 contract** to get the random number.

* Enter the **index** (starting from `0`, max = `numWords - 1`).

***

### **6. VRF Information**

#### **6.1 Bsc Mainnet**

**Contracts**

| Contracts Description  | Contract Address                           |
| ---------------------- | ------------------------------------------ |
| **Valueless Token**    | 0x6539e82D19A1D67696aCE0A0eBd919Cc50F8798C |
| **BlockHashStore**     | 0xbD5dE803a825f63e1Cc4B7ca734D8B0dAa04842f |
| **VRF Coordinator V2** | 0xA7dE2D68627604b9306Ea8d862b59511Ce338b2E |

&#x20;**VRF KeyHash** **Info**

| VRF KeyHash Description               | Contract Address                                                   |
| ------------------------------------- | ------------------------------------------------------------------ |
| **KeyHash 1** (Max Gas: **0.1 GWEI**) | 0x053706d82cd0b66e22cf62dc4aa0432a9ea2cf553dd461c5e8bcdd749477e79e |
| **KeyHash 2** (Max Gas: **0.5 GWEI**) | 0x5bf7283c4c33ea0521cd3783f6fc54d02dac226d15e9413b29ad8b87ff412710 |
| **KeyHash 3** (Max Gas: **1 GWEI**)   | 0xfcd833f258c49b2e37123040316b597116a9d85f59835b4b266da7789bc8a78d |


# On-Chain Costs

The **APRO VRF random number request fee** consists of **off-chain service costs** and **target chain gas fees**. Payment is made using **Valueless\_Test tokens** (a purely functional settlement unit).

The system dynamically optimizes fees based on the **real-time status of each blockchain network** and may offer **temporary gas subsidies or service discounts**.

All **fee details are publicly verifiable on-chain**.

**For more information on on-chain costs, please contact us via:**

* Email: <bd@apro.com>
* Telegram: [Head of Business Development](https://t.me/Annie_LLLEEE)

**You can pay service fees using the following tokens:**&#x20;

* **Native blockchain gas tokens** and their **ERC20-wrapped** versions.


# Terms of Use

By accessing this website and any materials presented herein (the “Site”), you agree to the following terms and conditions pertaining to the use of the Site. APRO Data Association and its subsidiaries and affiliates (collectively, “APRO”) reserve the right to change the terms, conditions, and notices under which this Site is offered without notice at any time. Each use of the Site constitutes your agreement to be bound by the then-current terms and conditions set forth in these Terms of Use. The Terms of Use incorporate the Data Protection and Privacy Policy.

&#x20;

### LIMITED LICENSE

&#x20;

Nothing contained in these Terms of Use or the Site itself grants or will be construed to grant to you or any third party any title or interest in or any license or right to use or reproduce, any image, text, software, code, trademark, logo, or service mark contained in the Site, including without limitation the names or logos of APRO. APRO reserves, and will enforce to the fullest extent possible, all rights that it may have with respect to copyright and trademark ownership of all material contained in the Site. APRO grants you a limited, nonexclusive license to display and otherwise use portions of the Site solely for your own private, non-commercial informational purposes only, and to print pages from the Site only in connection with that use. You may not modify, distribute, transmit, perform, reproduce, publish, license, create derivative works from, transfer, or sell any text, graphics, logos, and other source-identifying symbols, designs, icons, images, or other information, software, or code obtained from the Site.

&#x20;

### NO WARRANTY

&#x20;

APRO AND ITS RESPECTIVE OFFICERS, MANAGERS, DIRECTORS, PRINCIPALS, AGENTS, AND EMPLOYEES MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING THE ACCURACY, RELIABILITY, COMPLETENESS, SUITABILITY, OR OTHER CHARACTERISTICS OF THE INFORMATION AND MATERIALS CONTAINED ON OR PRESENTED THROUGH THE SITE. ANY CONTENT OF THE SITE IS SUBJECT TO CHANGE WITHOUT NOTICE. ALL SUCH INFORMATION AND MATERIALS ARE PROVIDED “AS IS”, WITHOUT ANY WARRANTY OF ANY KIND. APRO HEREBY FURTHER DISCLAIMS ALL WARRANTIES AND CONDITIONS WITH REGARD TO SUCH INFORMATION AND MATERIALS, INCLUDING ALL IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, NON-INFRINGEMENT, AND AVAILABILITY.

&#x20;

### LIMITATION OF LIABILITY

&#x20;

IN NO EVENT SHALL APRO, AND ITS RESPECTIVE OFFICERS, MANAGERS, DIRECTORS, PRINCIPALS, AGENTS, AND EMPLOYEES BE LIABLE FOR ANY CLAIMS, LIABILITIES, LOSSES, COSTS, OR DAMAGES, INCLUDING DIRECT, INDIRECT, PUNITIVE, INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, ARISING OUT OF OR IN ANY WAY CONNECTED WITH (I) THE USE OF OR INABILITY TO USE THE SITE OR WITH ANY DELAY IN USING THE SITE, OR (II) ANY INFORMATION AND MATERIALS OBTAINED THROUGH THE SITE, OR (III) OTHERWISE ARISING OUT OF THE USE OF THE SITE; IN ANY CASE WHETHER BASED ON THEORIES ARISING IN CONTRACT, TORT, STRICT LIABILITY, OR OTHERWISE. SUCH LIMITATIONS APPLY EVEN IF APRO OR ANY OF ITS RESPECTIVE OFFICERS, DIRECTORS, PRINCIPALS, AGENTS, OR EMPLOYEES HAVE BEEN ADVISED OF THE POSSIBILITY OF DAMAGES.

&#x20;

### GENERAL

&#x20;

If any provision of these Terms of Use is held to be invalid or unenforceable in any jurisdiction, then such provision shall be deemed modified to the minimum extent necessary so that such provision shall no longer be held to be invalid or unenforceable, and these Terms of Use shall be interpreted so as to achieve the intent expressed herein to the greatest extent possible in the jurisdiction in question. Any such modification, invalidity, or unenforceability shall be strictly limited both to such provision and to such jurisdiction.

&#x20;

### INTELLECTUAL PROPERTY

&#x20;

APRO owns intellectual property rights associated with the APRO Network and certain other products (the “Products”). APRO protects and maintains such intellectual property rights with the intent only to use such rights defensively, such as to protect the integrity of the Products and to ensure end users have clarity and certainty. Where appropriate, APRO will make the Products open to the community under open source licenses and pursuant to permissive brand use guidelines. Protecting IP rights in this capacity and making them available in this manner will enable the community to contribute to the ecosystem around each of the Products while not requiring that APRO play a central role in ongoing development, operation, and maintenance.

### **ELECTRONIC NOTICES**

You consent to receive all communications, agreements, documents, receipts, notices, and disclosures electronically (collectively, our “**Communications**”) that we provide in connection with these Terms or any Services. You agree that we may provide our Communications to you by posting them on the Website or through the Services or by emailing them to you at the email address you provide in connection with using the Services. You should maintain copies of our Communications by printing a paper copy or saving an electronic copy. You may also contact our support team to request additional electronic copies of our Communications by filing a support request at <support@apro.com>.

### **EXCLUSION OF CONSEQUENTIAL AND RELATED DAMAGES**

In no event will the Foundation, together with any Protected Party, be liable for any incidental, indirect, special, punitive, exemplary, consequential or similar damages or liabilities whatsoever (including, without limitation, damages for loss of data, information, revenue, goodwill, profits or other business or financial benefit) arising out of or in connection with the Website, the Services and the Chainlink Network (and any of their content and functionality), any execution or settlement of a transaction, any performance or non-performance of the Services, your Distributed Ledger Technology assets, other digital assets, Link Tokens or any other product, service or other item provided by or on behalf of a Protected Party, whether under contract, tort (including negligence), civil liability, statute, strict liability, breach of warranties, or under any other theory of liability, and whether or not any Protected Party has been advised of, knew of or should have known of the possibility of such damages and notwithstanding any failure of the essential purpose of these Terms or any limited remedy nor is the Foundation in any way responsible for the execution or settlement of transactions between users of Apro open-source software or the Apro Network.

### **LIMITATION OF LIABILITY**

In no event will the Protected Parties' aggregate liability arising out of or in connection with the Website, the Services and the Chainlink Network (and any of their content and functionality), any performance or non-performance of the Services, your Distributed Ledger Technology assets, other digital assets, Link Tokens or any other product, service or other item provided by or on behalf of a Protected Party, whether under contract, tort (including negligence), civil liability, statute, strict liability or other theory of liability exceed the amount of fees paid by you to us under these Terms in the twelve (12) month period immediately preceding the event giving rise to the claim for liability.

### **GOVERNING LAW**

The interpretation and enforcement of these Terms, and any dispute related to these Terms, the Website or the Services, will be governed by and construed and enforced in accordance with the laws of the British Virgin Islands, as applicable, without regard to conflict of law rules or principles (whether of the British Virgin Islands or any other jurisdiction) that would cause the application of the laws of any other jurisdiction. You agree that we may initiate a proceeding related to the enforcement or validity of our intellectual property rights in any court having jurisdiction. With respect to any other proceeding that is not subject to arbitration under these Terms, the courts located in the British Virgin Islands will have exclusive jurisdiction. You waive any objection to venue in any such courts.


# Privacy Policy

&#x20;The APRO Data Association (“APRO”) with registered office at \[BVI], respects the privacy of Personal Data and is committed to protecting Personal Data. This Data Protection and Privacy Policy (this “Policy”) describes the policies and procedures APRO has implemented to protect Personal Data Processed by APRO in accordance with applicable Data Protection Laws.

&#x20;

APRO has voluntarily opted to apply the protections and obligations outlined in this Policy to all Data Subjects. However, such protections and obligations may be beyond the legal requirements of the jurisdiction of certain Data Subjects. Data Protection Laws vary widely across jurisdictions and while APRO will strive to meet this Policy for all Data Subjects, the Data Protection Laws for the Data Subject ultimately govern the protections conferred in the specific jurisdiction applicable to that Data Subject, and this Policy does not confer any rights beyond those granted by the relevant Data Protection Laws.

&#x20;

This Policy describes how APRO collects and uses Personal Data, the circumstances under which APRO may share Personal Data, the applicable rights of Data Subjects, and APRO’s technical and physical safeguards to protect the security of Personal Data.

&#x20;

### DEFINITIONS

&#x20;

“Controller” means a natural or legal person, public authority, agency, or other body that, independently or jointly with others, determines the purpose and means of Processing Personal Data, as defined in Data Protection Laws. Controller shall refer to APRO, and with regard to certain processes, APRO may act as joint Controller with a third-party.

&#x20;

“Data Protection Laws” refer to applicable privacy legislations, regulations, or codes issued by data protection regulators.

&#x20;

“Data Subject” means a natural person who can be identified, directly or indirectly, by reference to their Personal Data.

&#x20;

“Personal Data” means any information attributable to an identified or identifiable natural person (a Data Subject), as defined in Data Protection Laws. Personal Data does not include data where the identity has been removed (anonymous data). Personal Data shall encompass Special Category Data.

&#x20;

“Process” or “Processing” or “Processed” or “Processes” means, as applicable, any operation or set of operations performed upon Personal Data, whether or not by automatic means.

&#x20;

“Processor” means a natural or legal person, public authority, agency, or other body that Processes Personal Data on behalf of a Controller, as defined in Data Protection Laws.

&#x20;

“Special Category Data” means Personal Data revealing racial or ethnic origin, criminal history, political opinions, religious or philosophical beliefs, sexual orientation, trade union membership, or health, genetic, or biometric data, or data pertaining to a child or minor.

&#x20;

### A. GENERAL DATA PROTECTION INFORMATION

&#x20;

### DATA PROTECTION PRINCIPLES

&#x20;

APRO is committed to processing data in accordance with its responsibilities under the Data Protection Laws, and in particular with the following principles:

&#x20;

\- Fair, lawful and transparent processing;

\- Collection for specified, explicit and legitimate purposes and no further processing in a manner that is incompatible with the specified purposes;

\- Limitation to what is adequate, relevant and necessary in relation to the purposes for which the Personal Data is processed;

\- Keep Personal Data accurate and up to date;

\- Keep Personal Data only for as long as it is necessary or legally required;

\- Process Personal Data in a manner that ensures appropriate security, including protection against unauthorized or unlawful processing and against accidental loss, destruction or damage;

\- Process Personal Data in accordance with the rights of the Data Subject;

\- Ensure an adequate level of data protection when transferring Personal Data to a country outside of the European Economic Area.

&#x20;

### LEGAL BASIS FOR PROCESSING PERSONAL DATA

&#x20;

APRO will only use Personal Data when Data Protection Laws allow APRO to do so. Personal Data shall be Processed in a manner that is adequate, relevant, and not excessive in relation to the intended business purpose(s) of such Processing. A legal basis is required to process Personal Data. Personal Data may be processed only if at least one of the following legal bases applies:

&#x20;

1\. Consent: Data Subject giving consent to the Processing of his or her Personal Data for a specific purpose(s);

2\. Contractual necessity: Processing is necessary for the performance of a contract to which the Data Subject is party or entering into a contract;

3\. Compliance with legal obligations: Processing is necessary for compliance with a legal obligation to which APRO is subject;

4\. Vital interests: Processing is necessary in order to protect the vital interests of the Data Subject or of another natural person;

5\. Public interests: Processing is permitted if it is necessary for the performance of a task carried out in the public interest;

6\. Legitimate interests: Processing is necessary for the purposes of the legitimate interests pursued by APRO or a third party, except where such interests are overridden by the interests or fundamental rights and freedoms of the Data Subject which require protection of Personal Data.

&#x20;

### RIGHTS OF DATA SUBJECTS

&#x20;

When applicable, APRO shall honor Data Subject rights, as described herein. In accordance with Data Protection Laws and in certain circumstances, a Data Subject may possess the right to:

&#x20;

1\. Request access to his or her Personal Data that APRO holds to check that it is accurately and lawfully being processed;

2\. Request correction of his or her Personal Data that APRO holds;

3\. Request erasure of his or her Personal Data;

4\. Object to Processing of his or her Personal Data where APRO relies on a legitimate interest (or those of a third party);

5\. Request restriction of Processing of his or her Personal Data;

6\. Request the transfer of his or her Personal Data;

7\. Withdraw consent at any time where APRO relies on consent to Process Personal Data;

8\. Be notified of a data breach involving a Data Subject's Personal Data.

&#x20;

APRO shall accept, when applicable, any written requests through the appropriate channels from a Data Subject to exercise his or her rights and freedoms pursuant to Data Protection Laws. APRO shall use reasonable means to verify the identity of the requester.

&#x20;

### APRO DATA PROTECTION OBLIGATIONS

&#x20;

APRO and its Personnel have implemented appropriate technical and organizational measures to provide adequate protection regarding Data Subjects’ rights and the lawful, fair, and transparent Processing of Personal Data, as described herein. APRO data protection obligations include the following:

&#x20;

1\. Consent: When consent is the lawful basis for Processing, APRO shall obtain the affirmative consent of a Data Subject prior to such Processing;

2\. Purpose Limitation: APRO shall restrict the Processing of Personal Data to the intended business purpose(s);

3\. Notification: APRO shall provide notification in clear language to a Data Subject at the outset of Processing;

4\. Access: Upon request by a Data Subject, APRO shall provide such Data Subject with access to his or her Personal Data in the possession or under the control of APRO;

5\. Correction: Upon request by a Data Subject, APRO shall correct any error or omission in a Data Subject’s Personal Data in the possession or under the control of APRO;

6\. Erasure: Upon request by a Data Subject, APRO shall erase such Data Subject’s Personal Data in the possession or under the control of APRO;

7\. Accuracy: APRO shall make a reasonable effort to verify that Personal Data Processed by or on behalf of APRO is accurate and complete;

8\. Protection: APRO shall protect Personal Data in its possession or under its control by securing against unauthorized Processing;

9\. Retention: Personal Data will be retained for as long as is necessary for the intended purpose;

10\. Breach Notification: In the case of a data breach, APRO shall notify the supervisory or data protection authorities within seventy-two (72) hours.

&#x20;

### SHARING OF PERSONAL DATA

&#x20;

APRO may share Personal Data with third-parties to Process (maintain, store, use) on APRO’s behalf. APRO requires all such Processors to take appropriate security measures to protect Personal Data in accordance with APRO’s policies. APRO does not allow Processors to Process Personal Data for their own purposes and only permits them to Process Personal Data for specified purposes and in accordance with APRO's instructions.

&#x20;

APRO may share Personal Data with third parties to Process on their own behalf. Such third parties will be considered joint-Controllers of such Personal Data. While joint-Controllers have shared discretion over the purposes of Processing, all such Controllers agree to Process such shared Personal Data in accordance with Data Protection Laws.

&#x20;

### TRANSFER OF PERSONAL DATA ABROAD

&#x20;

APRO may transfer your Personal Data to third-parties based abroad for the purposes of the data processing described in this Policy. Such third-parties are obliged to protect the privacy of individuals to the same extent as APRO does. If the level of data protection in a country does not correspond to the Swiss or European level, APRO contractually ensures that the protection of your Personal Data corresponds to that in Switzerland or the EU at all times.

&#x20;

### SECURITY MEASURES TAKEN TO PROTECT PERSONAL DATA

&#x20;

APRO has implemented appropriate elements of privacy by design in conjunction with technical and physical safeguards to protect the security of Personal Data from unauthorized or unlawful Processing. APRO uses a number of systems and applications to protect Personal Data at all times, which also allow for the following capabilities: the anonymization and encryption of Personal Data; the ability to ensure the ongoing confidentiality, integrity, availability, and resilience of Processing Personal Data; the ability to restore the availability and access to Personal Data in a timely manner in the event of a physical or technical incident; and a process for regularly testing, assessing, and evaluating, at least annually, the effectiveness of such security measures.

&#x20;

### THIRD PARTY WEBSITES AND SOCIAL MEDIA

&#x20;

This website may contain content and links to third-party websites that are not owned, operated, or controlled by APRO. APRO is not responsible for the privacy practices of or the content displayed on such third-party websites.

&#x20;

When engaging with APRO’s content on or through a third-party social networking website, plug-in, or application, APRO may Process Personal Data associated with your social media account.

&#x20;

### B. SCOPE AND PURPOSE OF COLLECTION, PROCESSING, AND USE OF PERSONAL DATA WHEN VISITING OUR WEBSITES

&#x20;

When you visit our websites, our servers temporarily save each access in a log file. The following data may be collected without your intervention and stored by APRO until deletion, as is necessary in compliance with applicable laws:

&#x20;

\- the IP address of the requested computer;

\- the name of your internet access provider (usually your internet access provider);

\- the date and time of access;

\- the name and URL of the retrieved file;

\- the page and address of the website from which you were redirected to the website and, if applicable, the search term used;

\- the country from which the website is accessed;

\- the operating system of your computer and the browser you are using (provider, version and language); and

\- the transmission protocol used (e.g. HTTP/1.1).

&#x20;

The collection and processing of this data is carried out for the purpose of enabling the use of the website (connection establishment), to permanently guarantee system security and stability and to enable the optimization of our internet offer as well as for internal statistical purposes.

&#x20;

### IF YOU CONTACT US BY E-MAIL

&#x20;

On the website you have the possibility to contact APRO or one of its experts by e-mail. You can also contact APRO for support questions by e-mail.

&#x20;

You are responsible for the message and/or transmitted content that you send to APRO. APRO recommends that you do not send any confidential data. Personal Data is only collected if you provide it to APRO voluntarily.

&#x20;

### WHEN YOU APPLY FOR A JOB

&#x20;

If you submit a letter of application by e-mail, APRO processes the Personal Data you provide in order to check your application and, if necessary, to contact you in this context.

&#x20;

### WHEN YOU APPLY AS DATA PROVIDER

&#x20;

When you apply as an APRO Data Provider, you may have to enter the following information into the online application form:

&#x20;

\- E-mail;

\- Company;

\- First Name;

\- Last Name;

\- Street;

\- Zip;

\- City; and

\- Country.

&#x20;

COOKIES, SCRIPTS AND RELATED TECHNOLOGIES

&#x20;

When you visit this website, APRO and its third-party service providers receive and record Personal Data that you may have provided and your digital signature, such as your IP address.

&#x20;

### TRACKING TOOLS

&#x20;

Google Analytics

&#x20;

We use Google Analytics, a web analytics service provided by Google Ireland Limited or Google Inc. Google Analytics uses methods that enable an analysis of the use of the website, such as cookies.

&#x20;

Google Tag Manager

&#x20;

We use Google Tag Manager, a service of Google Ireland Limited or Google Inc. to manage cookies and pixels for tracking tools and other tools.

&#x20;

Cloudflare Insights

&#x20;

We use the website functions from Cloudflare. Cloudflare offers a globally distributed content delivery network with DNS.

&#x20;

### ADOBE TYPEKIT

&#x20;

This website uses so-called web fonts provided by Adobe Typekit for the uniform display of fonts.

&#x20;

### LINKS TO OUR SOCIAL MEDIA PRESENCES

&#x20;

On the website, we have set up links to our social media presences on the following social networks.

&#x20;

### REVIEW AND UPDATES TO POLICY

&#x20;

APRO will review and may update this Policy to reflect changes to APRO’s privacy practices or security measures as needed.

&#x20;

### CONTACT

&#x20;

Please contact APRO by email at \[<support@apro.com>] hould you have any questions or comments about this Policy or your Personal Data.

<br>


# Node operator

<table><thead><tr><th>Logo</th><th width="216.33333333333331">Company Name</th><th>Link</th></tr></thead><tbody><tr><td><img src="https://content.gitbook.com/content/3IkJaplyW01Y7PIftbCj/blobs/XukDBdvtZhXu7WllLbpe/logo.png" alt="" data-size="original"></td><td><strong>UXUY</strong></td><td><a href="https://uxuy.com/">https://uxuy.com/</a></td></tr><tr><td><img src="https://content.gitbook.com/content/3IkJaplyW01Y7PIftbCj/blobs/IGsg1C2mcMWDKh9I2QeC/highlight.png" alt="" data-size="original"></td><td><strong>Highlight</strong></td><td></td></tr><tr><td><img src="https://content.gitbook.com/content/3IkJaplyW01Y7PIftbCj/blobs/aVKyPgTWISygfStRAtv3/ABCDE.jpeg" alt="" data-size="original"></td><td><strong>ABCDE</strong></td><td><a href="https://www.abcde.com/">https://www.abcde.com/</a></td></tr><tr><td><img src="https://content.gitbook.com/content/3IkJaplyW01Y7PIftbCj/blobs/tqCaNhvAypnXlYUHc8Of/image.png" alt="" data-size="original"></td><td><strong>BeWater</strong></td><td><a href="https://t.co/fKYlAXm628">bewater.xyz</a></td></tr></tbody></table>


