Skip to content

Commit

Permalink
Fix #115 add TruevalAgentBatch agent and tests (#116)
Browse files Browse the repository at this point in the history
  • Loading branch information
trizin authored Sep 2, 2023
1 parent c73c915 commit ae3804f
Show file tree
Hide file tree
Showing 14 changed files with 584 additions and 262 deletions.
3 changes: 3 additions & 0 deletions mypy.ini
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ ignore_missing_imports = True
[mypy-eth_keys.*]
ignore_missing_imports = True

[mypy-eth_typing.*]
ignore_missing_imports = True

[mypy-matplotlib.*]
ignore_missing_imports = True

Expand Down
2 changes: 1 addition & 1 deletion pdr_backend/models/predictoor_batcher.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from typing import List
from enforce_typing import enforce_types
from eth_typing import ChecksumAddress # type: ignore
from eth_typing import ChecksumAddress
from pdr_backend.util.contract import get_contract_abi
from pdr_backend.util.web3_config import Web3Config

Expand Down
45 changes: 42 additions & 3 deletions pdr_backend/trueval/main.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,50 @@
import sys

from enforce_typing import enforce_types

from pdr_backend.trueval.trueval_agent_base import get_trueval
from pdr_backend.trueval.trueval_agent_batch import TruevalAgentBatch
from pdr_backend.trueval.trueval_agent_single import TruevalAgentSingle
from pdr_backend.trueval.trueval_config import TruevalConfig
from pdr_backend.trueval.trueval_agent import TruevalAgent, get_trueval
from pdr_backend.util.contract import get_address


HELP = """Trueval runner.
Usage: python pdr_backend/trueval/main.py APPROACH
where APPROACH=1 submits truevals one by one
APPROACH=2 submits truevals in a batch
"""


def do_help():
print(HELP)
sys.exit()


@enforce_types
def main(testing=False):
if len(sys.argv) <= 1:
do_help()
arg1 = sys.argv[1]
config = TruevalConfig()
t = TruevalAgent(config, get_trueval)
t.run(testing)

if arg1 == "1":
t = TruevalAgentSingle(config, get_trueval)
t.run(testing)

elif arg1 == "2":
predictoor_batcher_addr = get_address(
config.web3_config.w3.eth.chain_id, "PredictoorHelper"
)
t = TruevalAgentBatch(config, get_trueval, predictoor_batcher_addr)
t.run(testing)

elif arg1 == "help":
do_help()
else:
do_help()


if __name__ == "__main__":
Expand Down
24 changes: 24 additions & 0 deletions pdr_backend/trueval/test/conftest.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import os
from unittest.mock import Mock, patch
from pdr_backend.conftest_ganache import * # pylint: disable=wildcard-import
from pdr_backend.models.feed import Feed
from pdr_backend.models.slot import Slot
from pdr_backend.trueval.trueval_config import TruevalConfig


@pytest.fixture()
Expand Down Expand Up @@ -34,3 +36,25 @@ def set_env_vars():
os.environ["OWNER_ADDRS"] = original_value
else:
os.environ.pop("OWNER_ADDRS", None)


@pytest.fixture()
def trueval_config():
return TruevalConfig()


@pytest.fixture()
def predictoor_contract_mock():
with patch(
"pdr_backend.trueval.trueval_agent_base.PredictoorContract",
return_value=mock_contract(),
) as mock_predictoor_contract_mock:
yield mock_predictoor_contract_mock


def mock_contract(*args, **kwarg):
m = Mock()
m.get_secondsPerEpoch.return_value = 60
m.submit_trueval.return_value = {"tx": "0x123"}
m.contract_address = "0x1"
return m
46 changes: 28 additions & 18 deletions pdr_backend/trueval/test/test_trueval.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,24 @@
from enforce_typing import enforce_types
from unittest.mock import patch

from pdr_backend.trueval.trueval_agent import get_trueval
import pytest

from pdr_backend.trueval.main import get_trueval
from pdr_backend.models.feed import Feed


def mock_fetch_ohlcv(*args, **kwargs):
since = kwargs.get("since")
if since == 1000:
return [[1000, 100], [2000, 200]]
else:
raise ValueError("Invalid timestamp")


def mock_fetch_ohlcv_fail(*args, **kwargs):
return [[0, 0]]


@enforce_types
def test_get_trueval_success(monkeypatch):
feed = Feed(
Expand All @@ -30,46 +45,43 @@ def mock_fetch_ohlcv(*args, **kwargs):

monkeypatch.setattr("ccxt.kraken.fetch_ohlcv", mock_fetch_ohlcv)

result = get_trueval(feed, 1, 2)
assert result == (True, False) # 1st True because 200 > 100


@enforce_types
def test_get_trueval_live_lowercase_slash():
def test_get_trueval_live_lowercase_slash_5m():
feed = Feed(
name="ETH-USDT",
address="0x1",
symbol="ETH-USDT",
seconds_per_epoch=60,
seconds_per_subscription=500,
pair="btc/usdt",
source="kraken",
source="kucoin",
timeframe="5m",
trueval_submit_timeout=100,
owner="0xowner",
)

result = get_trueval(feed, 1692943200, 1692943500)
assert result == (True, False)
result = get_trueval(feed, 1692943200, 1692943200 + 5 * 60)
assert result == (False, False)


@enforce_types
def test_get_trueval_live_lowercase_dash():
def test_get_trueval_live_lowercase_dash_1h():
feed = Feed(
name="ETH-USDT",
address="0x1",
symbol="ETH-USDT",
seconds_per_epoch=60,
seconds_per_subscription=500,
pair="btc-usdt",
source="kraken",
timeframe="5m",
source="kucoin",
timeframe="1h",
trueval_submit_timeout=100,
owner="0xowner",
)

result = get_trueval(feed, 1692943200, 1692943500)
assert result == (True, False)
result = get_trueval(feed, 1692943200, 1692943200 + 1 * 60 * 60)
assert result == (False, False)


@enforce_types
Expand All @@ -87,10 +99,8 @@ def test_get_trueval_fail(monkeypatch):
owner="0xowner",
)

def mock_fetch_ohlcv_fail(*args, **kwargs):
return []

monkeypatch.setattr("ccxt.kraken.fetch_ohlcv", mock_fetch_ohlcv_fail)

result = get_trueval(feed, 1, 2)
assert result == (False, True) # 2nd True because failed
with pytest.raises(Exception):
result = get_trueval(feed, 1, 2)
assert result == (False, True) # 2nd True because failed
Loading

0 comments on commit ae3804f

Please sign in to comment.