Fair Market Value
This guide walks you through consuming Fair Market Value on Arbitrum using our on-chain delivery. Several asset pairs are publicly available, meaning you can access free hourly updates or update on-demand by covering the gas fee. We've developed this solution to demonstrate how you could consume our data on-chain. If you're interested in consuming any other Kaiko data on-chain please get in touch.
Read and update manually
Visit onchain.kaiko.com. Here, you can see the latest Kaiko price updates for all pairs.
To update the price:
Click "connect wallet"
Once you've connected your wallet, click "Update"
Authorize the gas payment of 0.00000112 ETH
Wait a few seconds for the prices to be updated
Update and read on-chain
To read and update on-chain, you'll need to set up an off-chain listening event using a node provider of your choice to connect to the blockchain.
To update the price:
This example script uses Typescript, but you can produce similar results using other coding languages. Running the script requests a price update and listens until it's been updated on-chain. When the update is detected, it alerts your on-chain smart contract.
Install ethers
npm install ethers
Send a gas fee with a value of 0.00000112 ETH to the
refreshPriceFeeds
contract address0xff2743c44f820c64c94eccfc1b497a1019541097
import { ethers } from 'ethers';
// Set up your Ethereum provider
const provider = new ethers.providers.JsonRpcProvider("<YOUR_PROVIDER_URL>");
// Initialize wallet using private key and connect it to the provider
const wallet = new ethers.Wallet("<YOUR_PRIVATE_KEY>", provider);
// Smart contract address
const contractAddress = "0xff2743c44f820c64c94eccfc1b497a1019541097";
// ABI definition of the contract's refreshPriceFeeds method
const abi = [
"function refreshPriceFeeds() payable external"
];
// Create an instance of the contract
const contract = new ethers.Contract(contractAddress, abi, wallet);
async function refreshPriceFeeds() {
try {
// Define the amount of ETH to send (0.00000112 ETH)
const amountToSend = ethers.utils.parseEther("0.00000112");
// Call the refreshPriceFeeds function, sending 0.00000112 ETH
const tx = await contract.refreshPriceFeeds({
value: amountToSend // Send 0.00000112 ETH
});
// Wait for the transaction to be mined
console.log("Transaction sent. Waiting for confirmation...");
const receipt = await tx.wait();
console.log("Transaction confirmed, receipt:", receipt);
} catch (error) {
console.error("Error while calling refreshPriceFeeds:", error);
}
}
// Call the function
refreshPriceFeeds();
Wait for at least one block for the price update to be reflected on-chain
Read the price on-chain:
This Solidity contract example is triggered by the refreshPriceFeeds
function in the Typescript example above. When triggered, it ingests the updated prices on-chain.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IExternalContract {
function latestUpdate() external view returns (uint256 price, uint256 decimals, uint256 updatedAt);
}
contract CallLatestUpdate {
address public externalContractAddress = <PRICE_CONTRACT_ADDRESS>;
// Function to call the latestUpdate() function on the external contract
function getLatestUpdate() public view returns (uint256 price, uint256 decimals, uint256 updatedAt) {
// Create an instance of the external contract using the interface
IExternalContract externalContract = IExternalContract(externalContractAddress);
// Call the latestUpdate() function on the external contract
return externalContract.latestUpdate();
}
}
Although one price update refreshes all prices on-chain, you must read each price feed individually. See the price feeds and their corresponding addresses at onchain.kaiko.com.
Last updated
Was this helpful?