Network Coverage
Per‑network, tested snippets for core reader (ICoreMultidataFeedsReader) and optional Aggregator API. Values are scaled by 2**112 for core reader.
- Arbitrum
- Base
- Optimism
RPC: https://arb1.arbitrum.io/rpc
// Core reader (Web3.js) — id-based quoting (works regardless of metric names)
const Web3 = require('web3');
const RPC = 'https://arb1.arbitrum.io/rpc';
const ORACLE = '0x11da6b6e5D62F0DC798933A926019e70Cbe5aB9a';
const ABI=[
{inputs:[],name:'getMetrics',outputs:[{type:'tuple[]',components:[{name:'name',type:'string'},{name:'description',type:'string'},{name:'currency',type:'string'},{name:'tags',type:'string[]'}]}],stateMutability:'view',type:'function'},
{inputs:[{internalType:'uint256[]',name:'ids',type:'uint256[]'}],name:'quoteMetrics',outputs:[{components:[{internalType:'uint256',name:'value',type:'uint256'},{internalType:'uint32',name:'updateTS',type:'uint32'}],internalType:'tuple[]',name:'quotes',type:'tuple[]'}],stateMutability:'view',type:'function'}
];
(async()=>{
const web3=new Web3(RPC);
const c=new web3.eth.Contract(ABI,ORACLE);
const metrics=await c.methods.getMetrics().call();
const ids=[0,1];
const out=await c.methods.quoteMetrics(ids).call();
out.forEach((q,idx)=>{
const v=Number(q.value)/2**112, ts=Number(q.updateTS);
console.log(metrics[ids[idx]].name,{value:v,updateTS:ts});
});
})();
// Aggregator API (Ethers.js) — ETH/USD
import { ethers } from 'ethers';
const RPC='https://arb1.arbitrum.io/rpc';
const ETH_USD='0x5fd8AdE1c5535a4673DE49767A31B66DC7071154';
const ABI=[{"inputs":[],"name":"latestRoundData","outputs":[{"name":"roundId","type":"uint80"},{"name":"answer","type":"int256"},{"name":"startedAt","type":"uint256"},{"name":"updatedAt","type":"uint256"},{"name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"}];
(async()=>{
const p=new ethers.JsonRpcProvider(RPC);
const c=new ethers.Contract(ETH_USD,ABI,p);
const [,answer,,updatedAt]=await c.latestRoundData();
console.log('ETH/USD',Number(answer)/1e8,'updatedAt',Number(updatedAt));
})();
RPC: https://mainnet.base.org
// Core reader (Ethers.js) — id-based quoting
import { ethers } from 'ethers';
const RPC='https://mainnet.base.org';
const ORACLE='0x11da6b6e5D62F0DC798933A926019e70Cbe5aB9a';
const ABI=[
{inputs:[],name:'getMetrics',outputs:[{type:'tuple[]',components:[{name:'name',type:'string'},{name:'description',type:'string'},{name:'currency',type:'string'},{name:'tags',type:'string[]'}]}],stateMutability:'view',type:'function'},
{inputs:[{internalType:'uint256[]',name:'ids',type:'uint256[]'}],name:'quoteMetrics',outputs:[{components:[{internalType:'uint256',name:'value',type:'uint256'},{internalType:'uint32',name:'updateTS',type:'uint32'}],internalType:'tuple[]',name:'quotes',type:'tuple[]'}],stateMutability:'view',type:'function'}
];
(async()=>{
const p=new ethers.JsonRpcProvider(RPC);
const c=new ethers.Contract(ORACLE,ABI,p);
const metrics=await c.getMetrics();
const ids=[0,1].filter(i=>i<metrics.length);
const out=await c["quoteMetrics(uint256[])"](ids);
console.log(out.map((q,idx)=>({name:metrics[ids[idx]].name,v:Number(q.value)/2**112,ts:Number(q.updateTS)})));
})();
RPC: https://mainnet.optimism.io
// Core reader (Web3.js) — id-based quoting
const Web3 = require('web3');
const RPC='https://mainnet.optimism.io';
const ORACLE='0x11da6b6e5D62F0DC798933A926019e70Cbe5aB9a';
const ABI=[
{inputs:[],name:'getMetrics',outputs:[{type:'tuple[]',components:[{name:'name',type:'string'},{name:'description',type:'string'},{name:'currency',type:'string'},{name:'tags',type:'string[]'}]}],stateMutability:'view',type:'function'},
{inputs:[{internalType:'uint256[]',name:'ids',type:'uint256[]'}],name:'quoteMetrics',outputs:[{components:[{internalType:'uint256',name:'value',type:'uint256'},{internalType:'uint32',name:'updateTS',type:'uint32'}],internalType:'tuple[]',name:'quotes',type:'tuple[]'}],stateMutability:'view',type:'function'}
];
(async()=>{
const w=new Web3(RPC);
const c=new w.eth.Contract(ABI,ORACLE);
const m=await c.methods.getMetrics().call();
const ids=[0,1];
const out=await c.methods.quoteMetrics(ids).call();
console.log(out.map((q,idx)=>({name:m[ids[idx]].name,v:Number(q.value)/2**112,ts:Number(q.updateTS)})));
})();
Note: Mainnet core reader requires a full RPC (Infura/Alchemy/etc). As a quick alternative on mainnet, use the Aggregator API with the addresses listed under “Contracts → Chainlink Compatible Aggregators”.