Tellor Docs
Search…
Creating a New Query Type
To check out our current feeds and/or use our tool to make a new one, checkout our querybuilder: https://queryidbuilder.herokuapp.com/ .
To add a new data type to Tellor, you'll just need to define a new queryType . This is how you form a question so that Tellor reporters know exactly what data is being requested. You'll need to determine three things: a unique queryType name, inputs, and outputs. So let's say you want a query for getting the price of any asset in any currency. In human-readable form, your question could look like this:
What is the price of asset in currency ?
You might formally define your query like this:
Name: SpotPrice
Inputs:
1. asset (string): Asset ID (e.g. btc)
2. currency (string): Selected currency (e.g. usd)
Outputs:
1. price (uint256)
- abi_type: ufixed256x18 (18 decimals of precision)
- packed: false
Once Tellor reporters are submitting your new queryType on chain, you can retrieve your desired data with the help of UsingTellor, which is a helper contract that provides various Tellor data getters. You'll first put your question in queryData format, which means encoding your queryType name and arguments into bytes (see below). You'll then need to get a queryId, which is the bytes32 unique identifier for each Tellor data feed. The queryId is defined as the keccak256 hash of queryData. Once you know the queryId you'll be able to retrieve your data.
In Solidity, your contract can get data like this:
1
contract ExampleContract is UsingTellor {
2
3
// _tellorAddress is the address of the Tellor oracle
4
constructor(address payable _tellorAddress) UsingTellor(_tellorAddress) {}
5
6
function getSpotPrice(string memory _asset, string memory _currency) external view returns(bytes memory) {
7
bytes memory _queryData = abi.encode("SpotPrice", abi.encode(_asset, _currency));
8
bytes32 _queryId = keccak256(_queryData);
9
(bool ifRetrieve, bytes memory _value, ) =
10
getCurrentValue(_queryId);
11
if (!ifRetrieve) return "0x";
12
return _value;
13
}
14
}
Copied!
If you input btc and usd, respectively, the queryData would be
0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000953706f745072696365000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003627463000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037573640000000000000000000000000000000000000000000000000000000000
and the queryId would be
0xa6f013ee236804827b77696d350e9f0ac3e879328f2a3021d473a0b778ad78ac
Feel free to start building a query now and integrating it into your project. You can use the Query Builder app for help forming your query. When you reach the later stages of building your project, add an issue to Tellor's dataSpecs repository so that data reporters know how to fulfill your query. Feel free to reach out to the Tellor team for assistance, and happy building!
\
\
\
\
Copy link