Note
This demo represents an educational example to use a Chainlink system, product, or service and is provided to demonstrate how to interact with Chainlink’s systems, products, and services to integrate them into your own. This template is provided “AS IS” and “AS AVAILABLE” without warranties of any kind, it has not been audited, and it may be missing key checks or error handling to make the usage of the system, product or service more clear. Do not use the code in this example in a production environment without completing your own audits and application of best practices. Neither Chainlink Labs, the Chainlink Foundation, nor Chainlink node operators are responsible for unintended outputs that are generated due to errors in code.
This project demonstrates how to use Chainlink Data Streams - part of Chainlink’s family of low-latency, hybrid price feed solutions in a full-stack implementation.
./app
directory is a Next.js project bootstrapped with create-next-app
.
It contains the frontend for the data feeds demo dApp.
Install all dependencies:
cd app
npm install
Set environment variables by copying .env.example
to .env
and filling in the values:
- NEXT_PUBLIC_ALCHEMY_API_KEY for the network you want to use. You can get one from Alchemy.
- NEXT_PUBLIC_WALLET_CONNECT_ID for the wallet connector. You can get one from WalletConnect.
For connecting to Chainlink's Low Latency feeds you need to also fill in the following .env
variables:
- CHAINLINK_CLIENT_ID - The ID is provided to you by Chainlink.
- CHAINLINK_CLIENT_SECRET - The secret is provided to you by Chainlink.
- CHAINLINK_API_URL api url for consuming the feeds via REST. No
http/https
prefixes should be used. Example:api.chain.link
- CHAINLINK_WEBSOCKET_URL optional for consuming feeds via websocket. No
http/https
prefixes should be used. Example:ws.chain.link
You can get those from your Chainlink platform coordinator.
Run npm run dev
in your terminal, and then open localhost:3000 in your browser.
./contracts
folder is a project that utlizes the low latency on-chain data streams functionality that Chainlink presents. This is used by the DataStreamsConsumer.sol
contract to trade two ERC20 tokens on UniSwap. The purpose of this is to prevent front-running and automate trade execution. This repository uses the Hardhat environment for development and testing.
-
This contract uses Chainlink Automation Log Trigger to require data. This log trigger comes from the
DataStreamsConsumer.sol
contract by the user when he executes thetrade
function which itself emits theInitiateTrade
event. -
This event will make the Decentralized Oracle Network call the
checkLog
function which will therefore trigger theStreamsLookup
error. After that you can model the reports as you wish in thecheckCallback
function. -
After that Chainlink Data Streams Engine will send the data to your
performUpkeep
function. The data will include a signed report that will be verified in theperformUpkeep
function and the extraData that has been sent which in our contract is the parameters of theInitiateTrade
event i.e the recipient, the address of the token sent, the address of the token that you will recieve of and the amount that you are going to be sending. The amount that you will receive is calculated by the Data Streams Engine when it sends the report that contains the price of the token received.
Note: The reports sent to the DataStreamsConsumer
contract are verified by a Verifier contract that you can set when initializing the contract.
This contract has been tested mainly on the Arbitrum Goerli testnet network as this is the only network that currently supports the Data Streams feature as of now.
- Install dependencies
cd contracts
npm install
- Set environment variables by copying
.env.example
to.env
and filling in the values:
- PRIVATE_KEY - for the account you want to use.
- ETHERSCAN_API_KEY - API key for Etherscan API access.
- INFURA_KEY - API key for Infura Ethereum node access.
You can deploy the contract by executing the deploy script:
npx hardhat run scripts/deploy.ts --network goerli
For your convenience the deploy script has all the constructor arguments filled in. If you want to change the constructor arguments you can check what data streams Chainlink currenly supports here
After deploying the DataStreamsConsumer
contract you should register your upkeep by following Chainlink's guide. In our use case "Contract to automate" and "Contract emitting logs" are the same contract i.e DataStreamsConsumer
. When you choose "Contract emitting logs" you should click the "use custom ABI instead?" option and send the DataStreamsConsumer.sol
ABI from the artifacts/contracts/DataStreamsConsumer.sol/DataStreamsConsumer.json
file. After sending the ABI you will have to pick an emitted log. Pick the InitiateTrade
option from the select with the events options and continue registering your upkeep.
You should set an initial balance of at least 2 LINK. The other inputs are optional and you can enter whatever value you want.
After you deploy the contracts and register the upkeep you should emit the InitialTrade
event from the emitter contract. You can do this by running:
npx hardhat run scripts/trade.ts --network goerli
If you haven't changed the feed it will trade WETH to USDC on the Arbitrum Goerli network. For successful trade you need to have WETH in your account. The trade script will approve the consumer contract to handle your tokens.
You can change the values of the trade function as you wish in case you want to change the value expected to be traded (as long as you have this much WETH).
We use the proxy pattern provided by the hardhat
environment for a better experience developing the Data Streams functionality.
After you have deployed the contract and you want to make some improvements on the DataStreamsConsumer
contract you can run the upgrade.ts
script as long as you change the proxyAddress
variable with your proxy address which you can get from the openzeppelin
folder.
-
In order to test this project you need to have filled the .env.example file
-
npx hardhat test
You can open an issue or drop us a line on Discord.