diff --git a/packages/packages.json b/packages/packages.json index 01f458c42..b6acaaf72 100644 --- a/packages/packages.json +++ b/packages/packages.json @@ -17,13 +17,13 @@ "contract/valory/relayer/0.1.0": "bafybeihzgjyvhtorugjw3yldznqsbwo3aqpxowm7k2nrvj6qtwpsc7jl7u", "skill/valory/market_manager_abci/0.1.0": "bafybeicymkyk7e5rohauml6xazai6mv2rqd3euz3ifbk2ftfkylhpgo4ra", "skill/valory/decision_maker_abci/0.1.0": "bafybeicr3o4z5ytp6njmsxlj3p6cbaxyad6tdv5kyoxaeon5da2wn6hxqy", - "skill/valory/trader_abci/0.1.0": "bafybeigpelxc6kppckpx4phewwyi24mejyz54fi6g5i7swnm3xi2x5olve", - "skill/valory/tx_settlement_multiplexer_abci/0.1.0": "bafybeibgzwhazshodynrpsowbnvy7awtl6vgzrf3yunvicgrha4hfzbsi4", - "skill/valory/staking_abci/0.1.0": "bafybeiduborfqevheegy3plk7bzhkl4fukwixvlb57tenijdepintubbdi", - "skill/valory/check_stop_trading_abci/0.1.0": "bafybeiat5hmo6i2r6t6ufyfnidvepixmbnppotdmztu4dad5j4hiewdh64", - "agent/valory/trader/0.1.0": "bafybeibj2ezsqdnqa5kcwnhv5ke6z6fgspfxlewnkakz5ci73nmen43cpe", - "service/valory/trader/0.1.0": "bafybeibocmmtkoqnx2k4uhovfzk563ki7onukirkpex7pjnwwaesilqf7a", - "service/valory/trader_pearl/0.1.0": "bafybeigin5i6pvy4mwcgarcna2xetlhrofnnj4l7fbfiirrecpzvn3vshe" + "skill/valory/trader_abci/0.1.0": "bafybeieya5jxda7vacxeaowaoyafqtyldzjsloxnj5gcnschxoicfmua3y", + "skill/valory/tx_settlement_multiplexer_abci/0.1.0": "bafybeic6w4wdyvicy3mvmvskp3fg2snthofb3z5kmqhfohqfiv65k7hlgq", + "skill/valory/staking_abci/0.1.0": "bafybeiegy5iny4x3jk2kjuykebxksoqhfl7irdcldbcwzrsvpopxooys2q", + "skill/valory/check_stop_trading_abci/0.1.0": "bafybeif6w4uc3pzrbuuhyktgehvwsq2gxv6udeivhlhijlguhmctxokdqa", + "agent/valory/trader/0.1.0": "bafybeiepmomqpnpmzwe2ed5qexpdnkmeaxhthuia4iqk7v24d6il4mgrh4", + "service/valory/trader/0.1.0": "bafybeigwrd7kjfygxvaxegnfu4l7vmdxcbe7hlur642mskzfoflahjnjdm", + "service/valory/trader_pearl/0.1.0": "bafybeiaxpxlmg7q3tg5sarbzntx443sgjvmkmgfhb4rvxgw4bdxkfejwhe" }, "third_party": { "protocol/open_aea/signing/1.0.0": "bafybeihv62fim3wl2bayavfcg3u5e5cxu3b7brtu4cn5xoxd6lqwachasi", diff --git a/packages/valory/agents/trader/aea-config.yaml b/packages/valory/agents/trader/aea-config.yaml index b573664c2..f13912808 100644 --- a/packages/valory/agents/trader/aea-config.yaml +++ b/packages/valory/agents/trader/aea-config.yaml @@ -47,12 +47,12 @@ skills: - valory/reset_pause_abci:0.1.0:bafybeiameewywqigpupy3u2iwnkfczeiiucue74x2l5lbge74rmw6bgaie - valory/termination_abci:0.1.0:bafybeif2zim2de356eo3sipkmoev5emwadpqqzk3huwqarywh4tmqt3vzq - valory/transaction_settlement_abci:0.1.0:bafybeic3tccdjypuge2lewtlgprwkbb53lhgsgn7oiwzyrcrrptrbeyote -- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeibgzwhazshodynrpsowbnvy7awtl6vgzrf3yunvicgrha4hfzbsi4 +- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeic6w4wdyvicy3mvmvskp3fg2snthofb3z5kmqhfohqfiv65k7hlgq - valory/market_manager_abci:0.1.0:bafybeicymkyk7e5rohauml6xazai6mv2rqd3euz3ifbk2ftfkylhpgo4ra - valory/decision_maker_abci:0.1.0:bafybeicr3o4z5ytp6njmsxlj3p6cbaxyad6tdv5kyoxaeon5da2wn6hxqy -- valory/trader_abci:0.1.0:bafybeigpelxc6kppckpx4phewwyi24mejyz54fi6g5i7swnm3xi2x5olve -- valory/staking_abci:0.1.0:bafybeiduborfqevheegy3plk7bzhkl4fukwixvlb57tenijdepintubbdi -- valory/check_stop_trading_abci:0.1.0:bafybeiat5hmo6i2r6t6ufyfnidvepixmbnppotdmztu4dad5j4hiewdh64 +- valory/trader_abci:0.1.0:bafybeieya5jxda7vacxeaowaoyafqtyldzjsloxnj5gcnschxoicfmua3y +- valory/staking_abci:0.1.0:bafybeiegy5iny4x3jk2kjuykebxksoqhfl7irdcldbcwzrsvpopxooys2q +- valory/check_stop_trading_abci:0.1.0:bafybeif6w4uc3pzrbuuhyktgehvwsq2gxv6udeivhlhijlguhmctxokdqa - valory/mech_interact_abci:0.1.0:bafybeih2cck5xu6yaibomwtm5zbcp6llghr3ighdnk56fzwu3ihu5xx35e customs: - valory/mike_strat:0.1.0:bafybeihjiol7f4ch4piwfikurdtfwzsh6qydkbsztpbwbwb2yrqdqf726m diff --git a/packages/valory/services/trader/service.yaml b/packages/valory/services/trader/service.yaml index bd0a928fe..3aa07a502 100644 --- a/packages/valory/services/trader/service.yaml +++ b/packages/valory/services/trader/service.yaml @@ -7,7 +7,7 @@ license: Apache-2.0 fingerprint: README.md: bafybeigtuothskwyvrhfosps2bu6suauycolj67dpuxqvnicdrdu7yhtvq fingerprint_ignore_patterns: [] -agent: valory/trader:0.1.0:bafybeibj2ezsqdnqa5kcwnhv5ke6z6fgspfxlewnkakz5ci73nmen43cpe +agent: valory/trader:0.1.0:bafybeiepmomqpnpmzwe2ed5qexpdnkmeaxhthuia4iqk7v24d6il4mgrh4 number_of_agents: 4 deployment: agent: diff --git a/packages/valory/services/trader_pearl/service.yaml b/packages/valory/services/trader_pearl/service.yaml index 540be3783..cf4ae4b6a 100644 --- a/packages/valory/services/trader_pearl/service.yaml +++ b/packages/valory/services/trader_pearl/service.yaml @@ -8,7 +8,7 @@ license: Apache-2.0 fingerprint: README.md: bafybeibg7bdqpioh4lmvknw3ygnllfku32oca4eq5pqtvdrdsgw6buko7e fingerprint_ignore_patterns: [] -agent: valory/trader:0.1.0:bafybeibj2ezsqdnqa5kcwnhv5ke6z6fgspfxlewnkakz5ci73nmen43cpe +agent: valory/trader:0.1.0:bafybeiepmomqpnpmzwe2ed5qexpdnkmeaxhthuia4iqk7v24d6il4mgrh4 number_of_agents: 1 deployment: agent: diff --git a/packages/valory/skills/check_stop_trading_abci/skill.yaml b/packages/valory/skills/check_stop_trading_abci/skill.yaml index 82a7943dd..c6630c50b 100644 --- a/packages/valory/skills/check_stop_trading_abci/skill.yaml +++ b/packages/valory/skills/check_stop_trading_abci/skill.yaml @@ -27,7 +27,7 @@ contracts: protocols: [] skills: - valory/abstract_round_abci:0.1.0:bafybeiar2yhzxacfe3qqamqhaihtlcimquwedffctw55sowx6rac3cm3ui -- valory/staking_abci:0.1.0:bafybeiduborfqevheegy3plk7bzhkl4fukwixvlb57tenijdepintubbdi +- valory/staking_abci:0.1.0:bafybeiegy5iny4x3jk2kjuykebxksoqhfl7irdcldbcwzrsvpopxooys2q behaviours: main: args: {} diff --git a/packages/valory/skills/staking_abci/skill.yaml b/packages/valory/skills/staking_abci/skill.yaml index 39144ec26..fc42de816 100644 --- a/packages/valory/skills/staking_abci/skill.yaml +++ b/packages/valory/skills/staking_abci/skill.yaml @@ -16,8 +16,10 @@ fingerprint: payloads.py: bafybeibnub5ehb2mvpcoan3x23pp5oz4azpofwrtcl32abswcfl4cmjlwq rounds.py: bafybeic7kre4hriounn6at63fjzttw45zoivxatg23cmojok4ah6fca7ca tests/__init__.py: bafybeid7m6ynosqeb4mvsss2hqg75aly5o2d47r7yfg2xtgwzkkilv2d2m + tests/test_dialogues.py: bafybeidwjk52mufwvkj4cr3xgqycbdzxc6gvosmqyuqdjarnrgwth6wcai tests/test_handers.py: bafybeibnxlwznx3tsdpjpzh62bnp6lq7zdpolyjxfvxeumzz52ljxfzpme tests/test_payloads.py: bafybeiaq2dxpbein6qhipalibi57x6niiydxi6kvbpeqripzlngcgpb3qq + tests/test_rounds.py: bafybeih27bkijv6vcqfdbrfxgbtajtqbquekknc77omkxsfgnboiduj7sm fingerprint_ignore_patterns: [] connections: [] contracts: diff --git a/packages/valory/skills/staking_abci/tests/test_dialogues.py b/packages/valory/skills/staking_abci/tests/test_dialogues.py new file mode 100644 index 000000000..b7073dec1 --- /dev/null +++ b/packages/valory/skills/staking_abci/tests/test_dialogues.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2021-2024 Valory AG +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ------------------------------------------------------------------------------ + +"""Test the dialogues.py module of the skill.""" + +# pylint: skip-file + +import packages.valory.skills.staking_abci.dialogues # noqa + + +def test_import() -> None: + """Test that the 'dialogues.py' Python module can be imported.""" diff --git a/packages/valory/skills/staking_abci/tests/test_rounds.py b/packages/valory/skills/staking_abci/tests/test_rounds.py new file mode 100644 index 000000000..9703a46df --- /dev/null +++ b/packages/valory/skills/staking_abci/tests/test_rounds.py @@ -0,0 +1,369 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2023-2024 Valory AG +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ------------------------------------------------------------------------------ + +"""This package contains the tests for rounds of StakingAbciApp.""" + +import json +from dataclasses import dataclass, field +from typing import Any, Callable, Dict, FrozenSet, Hashable, List, Mapping +from unittest import mock +from unittest.mock import MagicMock, patch + +import pytest + +from packages.valory.skills.abstract_round_abci.base import ( + AbciAppDB, + BaseTxPayload, + get_name, +) +from packages.valory.skills.abstract_round_abci.test_tools.rounds import ( + BaseCollectSameUntilThresholdRoundTest, +) +from packages.valory.skills.staking_abci.payloads import CallCheckpointPayload +from packages.valory.skills.staking_abci.rounds import ( + CallCheckpointRound, + CheckpointCallPreparedRound, + Event, + FinishedStakingRound, + ServiceEvictedRound, + StakingAbciApp, + StakingState, + SynchronizedData, +) + + +@pytest.fixture +def abci_app() -> StakingAbciApp: + """Fixture for StakingAbciApp.""" + synchronized_data = MagicMock() + logger = MagicMock() + context = MagicMock() + + return StakingAbciApp( + synchronized_data=synchronized_data, logger=logger, context=context + ) + + +DUMMY_SERVICE_STATE = { + "service_staking_state": StakingState.UNSTAKED.value, + "tx_submitter": "dummy_submitter", + "tx_hash": "dummy_tx_hash", +} + + +def get_participants() -> FrozenSet[str]: + """Participants""" + return frozenset([f"agent_{i}" for i in range(MAX_PARTICIPANTS)]) + + +def get_checkpoint_payloads(data: Dict) -> Mapping[str, CallCheckpointPayload]: + """Get payloads.""" + return { + participant: CallCheckpointPayload( + participant, + **data, + ) + for participant in get_participants() + } + + +@dataclass +class RoundTestCase: + """RoundTestCase""" + + name: str + initial_data: Dict[str, Hashable] + payloads: Mapping[str, BaseTxPayload] + final_data: Dict[str, Hashable] + event: Event + most_voted_payload: Any + synchronized_data_attr_checks: List[Callable] = field(default_factory=list) + + +MAX_PARTICIPANTS: int = 4 + + +class BaseStakingRoundTestClass(BaseCollectSameUntilThresholdRoundTest): + """Base test class for Staking rounds.""" + + round_class = CallCheckpointRound + synchronized_data: SynchronizedData + _synchronized_data_class = SynchronizedData + _event_class = Event + + def run_test(self, test_case: RoundTestCase) -> None: + """Run the test""" + # Set initial data + self.synchronized_data.update( + self._synchronized_data_class, **test_case.initial_data + ) + + test_round = self.round_class( + synchronized_data=self.synchronized_data, context=mock.MagicMock() + ) + + self._complete_run( + self._test_round( + test_round=test_round, + round_payloads=test_case.payloads, + synchronized_data_update_fn=lambda sync_data, _: sync_data.update( + **test_case.final_data + ), + synchronized_data_attr_checks=test_case.synchronized_data_attr_checks, + most_voted_payload=test_case.most_voted_payload, + exit_event=test_case.event, + ) + ) + + +class TestCallCheckpointRound(BaseStakingRoundTestClass): + """Tests for CallCheckpointRound.""" + + round_class = CallCheckpointRound + + @pytest.mark.parametrize( + "test_case", + [ + RoundTestCase( + name="Happy path", + initial_data={}, + payloads=get_checkpoint_payloads( + { + "service_staking_state": StakingState.STAKED.value, + "tx_submitter": "dummy_submitter", + "tx_hash": "dummy_tx_hash", + } + ), + final_data={ + "service_staking_state": StakingState.STAKED.value, + "tx_submitter": "dummy_submitter", + "tx_hash": "dummy_tx_hash", + }, + event=Event.DONE, + most_voted_payload=DUMMY_SERVICE_STATE["tx_submitter"], + synchronized_data_attr_checks=[ + lambda synchronized_data: synchronized_data.service_staking_state + == StakingState.STAKED.value, + lambda synchronized_data: synchronized_data.tx_submitter + == "dummy_submitter", + ], + ), + RoundTestCase( + name="Service not staked", + initial_data={}, + payloads=get_checkpoint_payloads(DUMMY_SERVICE_STATE), + final_data={}, + event=Event.SERVICE_NOT_STAKED, + most_voted_payload=DUMMY_SERVICE_STATE["tx_submitter"], + synchronized_data_attr_checks=[ + lambda synchronized_data: synchronized_data.service_staking_state + == 0, + ], + ), + RoundTestCase( + name="Service evicted", + initial_data={}, + payloads=get_checkpoint_payloads( + { + "service_staking_state": StakingState.EVICTED.value, + "tx_submitter": "dummy_submitter", + "tx_hash": "dummy_tx_hash", + } + ), + final_data={}, + event=Event.SERVICE_EVICTED, + most_voted_payload=DUMMY_SERVICE_STATE["tx_submitter"], + synchronized_data_attr_checks=[ + lambda synchronized_data: synchronized_data.service_staking_state + == 0, + ], + ), + RoundTestCase( + name="Next checkpoint not reached", + initial_data={}, + payloads=get_checkpoint_payloads( + { + "service_staking_state": StakingState.STAKED.value, + "tx_submitter": "dummy_submitter", + "tx_hash": None, + } + ), + final_data={}, + event=Event.NEXT_CHECKPOINT_NOT_REACHED_YET, + most_voted_payload=DUMMY_SERVICE_STATE["tx_submitter"], + synchronized_data_attr_checks=[ + lambda synchronized_data: synchronized_data.service_staking_state + == 0, + ], + ), + ], + ) + def test_run(self, test_case: RoundTestCase) -> None: + """Run the test.""" + + self.run_test(test_case) + + +class TestCheckpointCallPreparedRound: + """Tests for CheckpointCallPreparedRound.""" + + def test_checkpoint_call_prepared_round_initialization(self) -> None: + """Test the initialization of CheckpointCallPreparedRound.""" + round_ = CheckpointCallPreparedRound( + synchronized_data=MagicMock(), context=MagicMock() + ) + assert isinstance(round_, CheckpointCallPreparedRound) + + +class TestFinishedStakingRound: + """Tests for FinishedStakingRound.""" + + def test_finished_staking_round_initialization(self) -> None: + """Test the initialization of FinishedStakingRound.""" + round_ = FinishedStakingRound( + synchronized_data=MagicMock(), context=MagicMock() + ) + assert isinstance(round_, FinishedStakingRound) + + +class TestServiceEvictedRound: + """Tests for ServiceEvictedRound.""" + + def test_service_evicted_round_initialization(self) -> None: + """Test the initialization of ServiceEvictedRound.""" + round_ = ServiceEvictedRound(synchronized_data=MagicMock(), context=MagicMock()) + assert isinstance(round_, ServiceEvictedRound) + + +def test_staking_abci_app_initialization(abci_app: StakingAbciApp) -> None: + """Test the initialization of StakingAbciApp.""" + assert abci_app.initial_round_cls is CallCheckpointRound + assert abci_app.final_states == { + CheckpointCallPreparedRound, + FinishedStakingRound, + ServiceEvictedRound, + } + assert abci_app.transition_function == { + CallCheckpointRound: { + Event.DONE: CheckpointCallPreparedRound, + Event.SERVICE_NOT_STAKED: FinishedStakingRound, + Event.SERVICE_EVICTED: ServiceEvictedRound, + Event.NEXT_CHECKPOINT_NOT_REACHED_YET: FinishedStakingRound, + Event.ROUND_TIMEOUT: CallCheckpointRound, + Event.NO_MAJORITY: CallCheckpointRound, + }, + CheckpointCallPreparedRound: {}, + FinishedStakingRound: {}, + ServiceEvictedRound: {}, + } + assert abci_app.event_to_timeout == {Event.ROUND_TIMEOUT: 30.0} + assert abci_app.db_pre_conditions == {CallCheckpointRound: set()} + assert abci_app.db_post_conditions == { + CheckpointCallPreparedRound: { + get_name(SynchronizedData.tx_submitter), + get_name(SynchronizedData.most_voted_tx_hash), + get_name(SynchronizedData.service_staking_state), + }, + FinishedStakingRound: { + get_name(SynchronizedData.service_staking_state), + }, + ServiceEvictedRound: { + get_name(SynchronizedData.service_staking_state), + }, + } + + +DUMMY_PARTICIPANT_TO_CHECKPOINT = json.dumps( + { + "agent_0": {"sender": "agent_0", "data": "checkpoint_1"}, + "agent_1": {"sender": "agent_1", "data": "checkpoint_2"}, + } +) + + +@pytest.mark.parametrize( + "key,serialized_data,expected_result,property_to_check", + [ + ( + "participant_to_checkpoint", + DUMMY_PARTICIPANT_TO_CHECKPOINT, + json.loads(DUMMY_PARTICIPANT_TO_CHECKPOINT), + "participant_to_checkpoint", # Corresponds to _get_deserialized method + ), + ], +) +@patch( + "packages.valory.skills.staking_abci.rounds.CollectionRound.deserialize_collection" +) +def test_synchronized_data_get_deserialized( + mock_deserialize_collection: MagicMock, + key: str, + serialized_data: str, + expected_result: Mapping[str, Any], + property_to_check: str, +) -> None: + """Test the deserialization and property access in SynchronizedData.""" + # Mock the db.get_strict to return the serialized data + mock_db = mock.MagicMock() + mock_db.get_strict.return_value = serialized_data + + # Initialize SynchronizedData with the mocked db + synchronized_data = SynchronizedData(db=mock_db) + + # Mock the deserialize_collection function to return the expected deserialized result + mock_deserialize_collection.return_value = expected_result + + # Access the property using the appropriate property access method + deserialized_data = synchronized_data.participant_to_checkpoint + + # Ensure that get_strict is called with the correct key + mock_db.get_strict.assert_called_once_with(key) + + # Ensure that deserialize_collection is called with the correct serialized data + mock_deserialize_collection.assert_called_once_with(serialized_data) + assert deserialized_data == expected_result + + +def test_synchronized_data_tx_submitter() -> None: + """Test the tx_submitter property in SynchronizedData.""" + mock_db = mock.MagicMock() + mock_db.get_strict.return_value = "agent_0" + + synchronized_data = SynchronizedData(db=mock_db) + + assert synchronized_data.tx_submitter == "agent_0" + mock_db.get_strict.assert_called_once_with("tx_submitter") + + +def test_synchronized_data_service_staking_state() -> None: + """Test the service_staking_state property in SynchronizedData.""" + mock_db = mock.MagicMock() + mock_db.get.return_value = 0 + + synchronized_data = SynchronizedData(db=mock_db) + + staking_state = synchronized_data.service_staking_state + assert isinstance(staking_state, StakingState) + mock_db.get.assert_called_once_with("service_staking_state", 0) + + +def test_synchronized_data_initialization() -> None: + """Test the initialization and attributes of SynchronizedData.""" + data = SynchronizedData(db=AbciAppDB(setup_data={"test": ["test"]})) + assert data.db._data == {0: {"test": ["test"]}} diff --git a/packages/valory/skills/trader_abci/skill.yaml b/packages/valory/skills/trader_abci/skill.yaml index 3a2e90685..10905010d 100644 --- a/packages/valory/skills/trader_abci/skill.yaml +++ b/packages/valory/skills/trader_abci/skill.yaml @@ -28,9 +28,9 @@ skills: - valory/termination_abci:0.1.0:bafybeif2zim2de356eo3sipkmoev5emwadpqqzk3huwqarywh4tmqt3vzq - valory/market_manager_abci:0.1.0:bafybeicymkyk7e5rohauml6xazai6mv2rqd3euz3ifbk2ftfkylhpgo4ra - valory/decision_maker_abci:0.1.0:bafybeicr3o4z5ytp6njmsxlj3p6cbaxyad6tdv5kyoxaeon5da2wn6hxqy -- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeibgzwhazshodynrpsowbnvy7awtl6vgzrf3yunvicgrha4hfzbsi4 -- valory/staking_abci:0.1.0:bafybeiduborfqevheegy3plk7bzhkl4fukwixvlb57tenijdepintubbdi -- valory/check_stop_trading_abci:0.1.0:bafybeiat5hmo6i2r6t6ufyfnidvepixmbnppotdmztu4dad5j4hiewdh64 +- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeic6w4wdyvicy3mvmvskp3fg2snthofb3z5kmqhfohqfiv65k7hlgq +- valory/staking_abci:0.1.0:bafybeiegy5iny4x3jk2kjuykebxksoqhfl7irdcldbcwzrsvpopxooys2q +- valory/check_stop_trading_abci:0.1.0:bafybeif6w4uc3pzrbuuhyktgehvwsq2gxv6udeivhlhijlguhmctxokdqa - valory/mech_interact_abci:0.1.0:bafybeih2cck5xu6yaibomwtm5zbcp6llghr3ighdnk56fzwu3ihu5xx35e behaviours: main: diff --git a/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml b/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml index e97464c4a..065737d9d 100644 --- a/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml +++ b/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml @@ -24,7 +24,7 @@ protocols: skills: - valory/abstract_round_abci:0.1.0:bafybeiar2yhzxacfe3qqamqhaihtlcimquwedffctw55sowx6rac3cm3ui - valory/decision_maker_abci:0.1.0:bafybeicr3o4z5ytp6njmsxlj3p6cbaxyad6tdv5kyoxaeon5da2wn6hxqy -- valory/staking_abci:0.1.0:bafybeiduborfqevheegy3plk7bzhkl4fukwixvlb57tenijdepintubbdi +- valory/staking_abci:0.1.0:bafybeiegy5iny4x3jk2kjuykebxksoqhfl7irdcldbcwzrsvpopxooys2q - valory/mech_interact_abci:0.1.0:bafybeih2cck5xu6yaibomwtm5zbcp6llghr3ighdnk56fzwu3ihu5xx35e behaviours: main: diff --git a/tox.ini b/tox.ini index 1d83e9988..8c569a52f 100644 --- a/tox.ini +++ b/tox.ini @@ -105,6 +105,7 @@ commands = pytest -rfE {env:SKILLS_PATHS}/decision_maker_abci/tests --cov={env:SKILLS_PATHS}/decision_maker_abci --cov-report=xml --cov-report=term --cov-report=term-missing --cov-config=.coveragerc {posargs} pytest -rfE {env:SKILLS_PATHS}/check_stop_trading_abci/tests --cov={env:SKILLS_PATHS}/check_stop_trading_abci --cov-report=xml --cov-report=term --cov-report=term-missing --cov-config=.coveragerc {posargs} pytest -rfE {env:SKILLS_PATHS}/market_manager_abci/tests --cov={env:SKILLS_PATHS}/market_manager_abci --cov-report=xml --cov-report=term --cov-report=term-missing --cov-config=.coveragerc {posargs} + pytest -rfE {env:SKILLS_PATHS}/staking_abci/tests --cov={env:SKILLS_PATHS}/staking_abci --cov-report=xml --cov-report=term --cov-report=term-missing --cov-config=.coveragerc {posargs} [testenv:py3.8-linux] basepython = python3.8