Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FileCID Manual Report #737

Merged
merged 11 commits into from
Jan 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/telliot_feeds/feeds/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
from telliot_feeds.feeds.evm_call_feed import evm_call_feed
from telliot_feeds.feeds.evm_call_feed import evm_call_feed_example
from telliot_feeds.feeds.fil_usd_feed import fil_usd_median_feed
from telliot_feeds.feeds.fileCID_manual_feed import fileCID_manual_feed
from telliot_feeds.feeds.gas_price_oracle_feed import gas_price_oracle_feed
from telliot_feeds.feeds.gas_price_oracle_feed import gas_price_oracle_feed_example
from telliot_feeds.feeds.gno_usd_feed import gno_usd_median_feed
Expand Down Expand Up @@ -208,6 +209,7 @@
"MimicryMacroMarketMashup": mimicry_mashup_feed,
"EVMCall": evm_call_feed,
"CustomPrice": custom_price_manual_feed,
"FileCID": fileCID_manual_feed,
"BTCBalance": btc_balance_feed,
"EVMBalance": evm_balance_feed,
}
7 changes: 7 additions & 0 deletions src/telliot_feeds/feeds/fileCID_manual_feed.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from telliot_feeds.datafeed import DataFeed
from telliot_feeds.queries.fileCID import FileCID
from telliot_feeds.sources.manual.fileCID_manual_source import fileCIDManualSource

url = None

fileCID_manual_feed = DataFeed(query=FileCID(url=url), source=fileCIDManualSource())
32 changes: 32 additions & 0 deletions src/telliot_feeds/queries/fileCID.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
""" :mod:`telliot_feeds.queries.string_query`

"""
# Copyright (c) 2021-, Tellor Development Community
# Distributed under the terms of the MIT License.
from dataclasses import dataclass
from typing import Optional

from telliot_feeds.dtypes.value_type import ValueType
from telliot_feeds.queries.abi_query import AbiQuery


@dataclass
class FileCID(AbiQuery):
"""
A query type for IPFS content identifier CIDs
More info: add link to dataspec
"""

#: Static url
url: Optional[str]

def __init__(self, url: Optional[str]):
self.url = url

#: ABI used for encoding/decoding parameters
abi = [{"name": "url", "type": "string"}]

@property
def value_type(self) -> ValueType:
"""Returns a datatype for ipfs CIDs."""
return ValueType(abi_type="string", packed=False)
36 changes: 36 additions & 0 deletions src/telliot_feeds/sources/manual/fileCID_manual_source.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
from typing import Optional

from telliot_feeds.datasource import DataSource
from telliot_feeds.dtypes.datapoint import datetime_now_utc
from telliot_feeds.dtypes.datapoint import OptionalDataPoint
from telliot_feeds.utils.input_timeout import input_timeout
from telliot_feeds.utils.input_timeout import TimeoutOccurred
from telliot_feeds.utils.log import get_logger


logger = get_logger(__name__)


class fileCIDManualSource(DataSource[Optional[str]]):
async def fetch_new_datapoint(self) -> OptionalDataPoint[str]:

print("enter CID:\n")

try:
usr_inpt = input_timeout()
except TimeoutOccurred:
logger.info("Timeout occurred while waiting for user input")
return None, None

print(f"\nCID to be submitted to oracle->: {usr_inpt}")
print("Press [ENTER] to confirm.")
try:
_ = input_timeout()
except TimeoutOccurred:
logger.info("Timeout occurred while waiting for user to confirm")
return None, None

datapoint = (usr_inpt, datetime_now_utc())
self.store_datapoint(datapoint)

return datapoint
60 changes: 60 additions & 0 deletions tests/queries/test_query_fileCID.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
from eth_abi import decode_abi

from telliot_feeds.queries.fileCID import FileCID


def test_FileCID_query():
"""Test static query"""
q = FileCID(
url="https://raw.githubusercontent.com/tellor-io/dataSpecs/main/README.md",
)

exp_query_id = "81c2d4d0f826cc936f6bfc110120445d648b9f6ab815984420598bea60b416ca"
assert q.query_id.hex() == exp_query_id

exp_query_data = (
b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@"
b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80"
b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07FileCID\x00"
b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
b"\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00"
b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
b"\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00"
b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
b"\x00\x00\x00\x00\x00\x00\x00Dhttps://raw.githubusercontent.com/tellor-io/"
b"dataSpecs/main/README.md\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
)

assert q.query_data == exp_query_data

query_type, encoded_param_vals = decode_abi(["string", "bytes"], q.query_data)
assert query_type == "FileCID"

url = decode_abi([q.abi[0]["type"]], encoded_param_vals)[0]
assert url == "https://raw.githubusercontent.com/tellor-io/dataSpecs/main/README.md"

q = FileCID.get_query_from_data(exp_query_data)
assert isinstance(q, FileCID)


def test_encode_decode():
q = FileCID(
url="https://raw.githubusercontent.com/tellor-io/dataSpecs/main/README.md",
)

data = "QmdW4FNKsPS9yykKN5sC7Q53pdWJRz2TXgVRGnZHawP7qe"
submit_value = q.value_type.encode(data)
assert isinstance(submit_value, bytes)

decoded_data = q.value_type.decode(submit_value)
assert isinstance(decoded_data, str)
assert decoded_data == "QmdW4FNKsPS9yykKN5sC7Q53pdWJRz2TXgVRGnZHawP7qe"

submit_value = q.value_type.encode("QmdW4FNKsPS9yykKN5sC7Q53pdWJRz2TXgVRGnZHawP7qe")
assert isinstance(submit_value, bytes)
Loading