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

Feat/persist tool accuracy #343

Open
wants to merge 26 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 11 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
4b2828c
feat: persisting local tool info
annasambrook Oct 22, 2024
e98709e
changes to storage manager
annasambrook Oct 25, 2024
07c1c34
add updated_ts to EGreedyPolicy
annasambrook Oct 25, 2024
4be7e8b
storage manager changes
annasambrook Oct 25, 2024
b123430
refactor storage manager changes to remove redundant code
annasambrook Oct 25, 2024
553fc63
tomte check-code
annasambrook Oct 25, 2024
24eac66
chore: generators
annasambrook Oct 25, 2024
dce1f33
Merge branch 'refs/heads/main' into feat/persist-tool-accuracy
annasambrook Oct 25, 2024
2380698
chore: generators
annasambrook Oct 25, 2024
729f0f0
make type optional
annasambrook Oct 25, 2024
fb6daa1
add suggested changes
annasambrook Nov 1, 2024
d574ce1
refactor: _check_local_policy_store_overwrite
annasambrook Nov 14, 2024
427c678
refactor: constants
annasambrook Nov 14, 2024
857e999
implemented requested changes
annasambrook Nov 14, 2024
041eb72
chore: generators
annasambrook Nov 14, 2024
633c2ab
Merge remote-tracking branch 'refs/remotes/origin/main' into feat/per…
annasambrook Nov 14, 2024
ad023f6
chore: generators
annasambrook Nov 14, 2024
d38e7ab
fix if not accuracy_information
annasambrook Nov 15, 2024
d954db0
fix policy_store_update_offset not overridden at service level
annasambrook Nov 15, 2024
6b07270
remove elif is_first_period
annasambrook Nov 15, 2024
134b4ca
chore: generators
annasambrook Nov 15, 2024
31930a1
remove unused import
annasambrook Nov 15, 2024
acf1e8f
chore: generators
annasambrook Nov 15, 2024
5cce568
policy_store_update_offset override
annasambrook Nov 15, 2024
8f462e5
Merge branch 'refs/heads/main' into feat/persist-tool-accuracy
annasambrook Nov 15, 2024
1e23ec2
chore: generators
annasambrook Nov 15, 2024
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
12 changes: 6 additions & 6 deletions packages/packages.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,14 @@
"contract/valory/staking_token/0.1.0": "bafybeigwsffbzx62d3ikz5kyjsewcvknrrnq3bcqgktnbrcpz4g6lyu3eq",
"contract/valory/relayer/0.1.0": "bafybeicawmds6czx7db2lcktvexwrp245jpekgulndtos5s5zdid3ilvq4",
"skill/valory/market_manager_abci/0.1.0": "bafybeicia7itulcrxlwbmhfzxppgo5i33tb2nmcycwizftw7gps4dareka",
"skill/valory/decision_maker_abci/0.1.0": "bafybeidcnpwi4o7z4wsenxz7tklagdchqunvmdqeyplcybwkoywmb7tvlu",
"skill/valory/trader_abci/0.1.0": "bafybeictsdzjcfvfc2exc5jn4xvkowr24flw65blrgb5uj4jzcdwr7kgpi",
"skill/valory/tx_settlement_multiplexer_abci/0.1.0": "bafybeicdzirkebpbyhhkhordyte3gup32yt4nyfpijqihtpmceryrr5o74",
"skill/valory/decision_maker_abci/0.1.0": "bafybeiaqz3fonzyiaifqjpv2c4jlbqbo2vax6cjtivkvp7i2t7jr2vi5mi",
"skill/valory/trader_abci/0.1.0": "bafybeibaypb67vs44u3zjj5egnztsckqkpffoaido54yjoqk7hrugfcuwu",
"skill/valory/tx_settlement_multiplexer_abci/0.1.0": "bafybeicnmvvlcrqsqcbyhux4g2jxtkibgrjp7zr7h6welkfbthwerm4sau",
"skill/valory/staking_abci/0.1.0": "bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4",
"skill/valory/check_stop_trading_abci/0.1.0": "bafybeicsrrxjs6bup267jiek3r7eutd42ssfyjthyvxfku6qozw3xebxta",
"agent/valory/trader/0.1.0": "bafybeihylp5xyzdngcfme3flt2kl6k66s7u4pvb7lsv27mbgotve4y57rq",
"service/valory/trader/0.1.0": "bafybeig2qzh3alfvlwlxuek6235ujplhvtysnfkeq4iu7y6x6lptt7376i",
"service/valory/trader_pearl/0.1.0": "bafybeig4um4w3d4hxz4luwiezdqveuvjm7jgn3axwysrik2xdw2b3rjpta"
"agent/valory/trader/0.1.0": "bafybeibtlf2ju2ktpyt7loqt5npepm2ezm63sc54iw76mkyhvkch46ptoy",
"service/valory/trader/0.1.0": "bafybeic63mv4jupowirlwlavyilo6s672cebshfmculoxrgu64ddyuvfny",
"service/valory/trader_pearl/0.1.0": "bafybeifwesumqtcqfj77zcxl3me7pow5h7yxedeoc4ukbi6dq5je4z7qjm"
},
"third_party": {
"protocol/open_aea/signing/1.0.0": "bafybeihv62fim3wl2bayavfcg3u5e5cxu3b7brtu4cn5xoxd6lqwachasi",
Expand Down
7 changes: 4 additions & 3 deletions packages/valory/agents/trader/aea-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,10 @@ skills:
- valory/reset_pause_abci:0.1.0:bafybeigrdlxed3xlsnxtjhnsbl3cojruihxcqx4jxhgivkd5i2fkjncgba
- valory/termination_abci:0.1.0:bafybeib5l7jhew5ic6iq24dd23nidcoimzqkrk556gqywhoziatj33zvwm
- valory/transaction_settlement_abci:0.1.0:bafybeic7q7recyka272udwcupblwbkc3jkodgp74fvcdxb7urametg5dae
- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeicdzirkebpbyhhkhordyte3gup32yt4nyfpijqihtpmceryrr5o74
- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeicnmvvlcrqsqcbyhux4g2jxtkibgrjp7zr7h6welkfbthwerm4sau
- valory/market_manager_abci:0.1.0:bafybeicia7itulcrxlwbmhfzxppgo5i33tb2nmcycwizftw7gps4dareka
- valory/decision_maker_abci:0.1.0:bafybeidcnpwi4o7z4wsenxz7tklagdchqunvmdqeyplcybwkoywmb7tvlu
- valory/trader_abci:0.1.0:bafybeictsdzjcfvfc2exc5jn4xvkowr24flw65blrgb5uj4jzcdwr7kgpi
- valory/decision_maker_abci:0.1.0:bafybeiaqz3fonzyiaifqjpv2c4jlbqbo2vax6cjtivkvp7i2t7jr2vi5mi
- valory/trader_abci:0.1.0:bafybeibaypb67vs44u3zjj5egnztsckqkpffoaido54yjoqk7hrugfcuwu
- valory/staking_abci:0.1.0:bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4
- valory/check_stop_trading_abci:0.1.0:bafybeicsrrxjs6bup267jiek3r7eutd42ssfyjthyvxfku6qozw3xebxta
- valory/mech_interact_abci:0.1.0:bafybeid6m3i5ofq7vuogqapdnoshhq7mswmudhvfcr2craw25fdwtoe3lm
Expand Down Expand Up @@ -237,6 +237,7 @@ models:
rebet_chance: ${float:0.6}
mech_interaction_sleep_time: ${int:10}
use_mech_marketplace: ${bool:false}
policy_store_update_offset: ${int:259200}
Adamantios marked this conversation as resolved.
Show resolved Hide resolved
mech_marketplace_config:
mech_marketplace_address: ${str:0x0000000000000000000000000000000000000000}
priority_mech_address: ${str:0x0000000000000000000000000000000000000000}
Expand Down
2 changes: 1 addition & 1 deletion packages/valory/services/trader/service.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ license: Apache-2.0
fingerprint:
README.md: bafybeigtuothskwyvrhfosps2bu6suauycolj67dpuxqvnicdrdu7yhtvq
fingerprint_ignore_patterns: []
agent: valory/trader:0.1.0:bafybeihylp5xyzdngcfme3flt2kl6k66s7u4pvb7lsv27mbgotve4y57rq
agent: valory/trader:0.1.0:bafybeibtlf2ju2ktpyt7loqt5npepm2ezm63sc54iw76mkyhvkch46ptoy
number_of_agents: 4
deployment:
agent:
Expand Down
2 changes: 1 addition & 1 deletion packages/valory/services/trader_pearl/service.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ license: Apache-2.0
fingerprint:
README.md: bafybeibg7bdqpioh4lmvknw3ygnllfku32oca4eq5pqtvdrdsgw6buko7e
fingerprint_ignore_patterns: []
agent: valory/trader:0.1.0:bafybeihylp5xyzdngcfme3flt2kl6k66s7u4pvb7lsv27mbgotve4y57rq
agent: valory/trader:0.1.0:bafybeibtlf2ju2ktpyt7loqt5npepm2ezm63sc54iw76mkyhvkch46ptoy
number_of_agents: 1
deployment:
agent:
Expand Down
147 changes: 133 additions & 14 deletions packages/valory/skills/decision_maker_abci/behaviours/storage_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import csv
import json
from abc import ABC
from datetime import datetime
from io import StringIO
from typing import Any, Dict, Generator, List, Optional

Expand Down Expand Up @@ -226,23 +227,39 @@ def _get_tools(
):
yield from self.wait_for_condition_with_sleep(step)

def _try_recover_policy(self) -> Optional[EGreedyPolicy]:
"""Try to recover the policy from the policy store."""
def _read_tool_accuracy_local(self) -> Optional[str]:
"""Reads the accuracy info from the local policy store file."""
try:
policy_path = self.params.store_path / POLICY_STORE
with open(policy_path, "r") as f:
policy = f.read()
return EGreedyPolicy.deserialize(policy)
return policy

except Exception as e:
self.context.logger.warning(f"Could not recover the policy: {e}.")
return None

def _try_recover_policy(self) -> Optional[EGreedyPolicy]:
"""Try to recover the policy from the policy store."""
policy = self._read_tool_accuracy_local()
if policy:
# verify for updated_ts in policy, EGreedyPolicy accuracy_store now stores updated_ts
if policy and "updated_ts" not in policy:
# convert json str to dictionary
policy_data = json.loads(policy)
# add updated_ts to policy
policy_data["accuracy_store"]["updated_ts"] = 0
policy = json.dumps(policy_data)
return EGreedyPolicy.deserialize(policy)
else:
return None
annasambrook marked this conversation as resolved.
Show resolved Hide resolved

def _get_init_policy(self) -> EGreedyPolicy:
"""Get the initial policy."""
# try to read the policy from the policy store, and if we cannot recover the policy, we create a new one
return self._try_recover_policy() or EGreedyPolicy(self.params.epsilon)

def _fetch_accuracy_info(self) -> Generator[None, None, bool]:
def _fetch_accuracy_info(self) -> Generator[None, None, Optional[StringIO]]:
"""Fetch the latest accuracy information available."""
# get the CSV file from IPFS
self.context.logger.info("Reading accuracy information from IPFS...")
Expand All @@ -253,19 +270,111 @@ def _fetch_accuracy_info(self) -> Generator[None, None, bool]:
f"Could not retrieve data from the url {accuracy_link}. "
f"Received status code {response.status_code}."
)
return False
return None

self.context.logger.info("Parsing accuracy information of the tools...")
try:
self.accuracy_information = StringIO(response.body.decode())
tool_accuracy_data = StringIO(response.body.decode())
self.context.logger.info("Parsing accuracy information of the tools...")
return tool_accuracy_data

except (ValueError, TypeError) as e:
self.context.logger.error(
f"Could not parse response from ipfs server, "
f"the following error was encountered {type(e).__name__}: {e}"
)
return False
return None

return True
def _set_accuracy_info_from_remote(
self,
remote_accuracy_info: Generator[None, None, Optional[StringIO]]
) -> None:
"""Set the tool accuracy info from the remote store."""
tool_accuracy_data = remote_accuracy_info
annasambrook marked this conversation as resolved.
Show resolved Hide resolved

if tool_accuracy_data is not None:
self.accuracy_information = tool_accuracy_data

def _read_local_policy_date(self) -> int:
"""Reads the updated timestamp from the policy file."""
annasambrook marked this conversation as resolved.
Show resolved Hide resolved
self.context.logger.info("Reading policy updated timestamp...")
policy = self._read_tool_accuracy_local()
if policy:
policy_json = json.loads(policy)
updated_timestamp = policy_json.get("updated_ts")

if updated_timestamp:
self.context.logger.info(
f"Local updated timestamp found {updated_timestamp}"
annasambrook marked this conversation as resolved.
Show resolved Hide resolved
)
return updated_timestamp
else:
self.context.logger.info("No timestamp found. Using minium: 0")
annasambrook marked this conversation as resolved.
Show resolved Hide resolved
return 0
return 0

def _fetch_remote_tool_date(
self, remote_accuracy_info
annasambrook marked this conversation as resolved.
Show resolved Hide resolved
) -> Generator[None, None, int]:
"""Fetch the max transaction date from the remote accuracy storage."""
self.context.logger.info("Checking remote accuracy information date... ")
self.context.logger.info("Trying to read max date in file...")
tool_accuracy_data = remote_accuracy_info
annasambrook marked this conversation as resolved.
Show resolved Hide resolved

if tool_accuracy_data:
sep = self.acc_info_fields.sep
tool_accuracy_data.seek(0) # Ensure we’re at the beginning
reader = csv.DictReader(tool_accuracy_data.readlines(), delimiter=sep)

max_transaction_date = None

# try to read the maximum transaction date in the remote accuracy info
try:
for row in reader:
Adamantios marked this conversation as resolved.
Show resolved Hide resolved
current_transaction_date = row.get("max")
annasambrook marked this conversation as resolved.
Show resolved Hide resolved
if (
max_transaction_date is None
or current_transaction_date > max_transaction_date
):
max_transaction_date = current_transaction_date

except TypeError:
self.context.logger.warning(
"Invalid transaction date found. Continuing with local accuracy information..."
)
return 0

if max_transaction_date:
self.context.logger.info(f"Maximum date found: {max_transaction_date}")
format_str = "%Y-%m-%d %H:%M:%S"
annasambrook marked this conversation as resolved.
Show resolved Hide resolved
max_datetime = datetime.strptime(max_transaction_date, format_str)
unix_timestamp = int(max_datetime.timestamp())
print(f"returning timestamp: {unix_timestamp}")
return unix_timestamp

self.context.logger.info("No maximum date found.")
return 0

def _check_local_policy_store_overwrite(
self, remote_accuracy_info
) -> Generator[None, None, bool]:
"""Compare the local and remote policy store dates and decide which to use."""

local_policy_store_date = self._read_local_policy_date()
remote_policy_store_date = yield from self._fetch_remote_tool_date(
remote_accuracy_info
)

policy_store_update_offset = self.params.policy_store_update_offset

self.context.logger.info("Comparing tool accuracy dates...")
if remote_policy_store_date > (
local_policy_store_date - policy_store_update_offset
):
self.context.logger.info("Local policy store overwrite: True")
return True

self.context.logger.info("Local policy store overwrite: False")
return False
annasambrook marked this conversation as resolved.
Show resolved Hide resolved

def _update_accuracy_store(self, local_tools: List[str]) -> None:
"""Update the accuracy store file with the latest information available"""
Expand All @@ -291,6 +400,9 @@ def _update_accuracy_store(self, local_tools: List[str]) -> None:
for tool in local_tools:
accuracy_store.setdefault(tool, AccuracyInfo())

self.policy.accuracy_store["accuracy_info"].updated_ts = int(
datetime.now().timestamp()
)
annasambrook marked this conversation as resolved.
Show resolved Hide resolved
self.policy.update_weighted_accuracy()

def _set_policy(self) -> Generator:
Expand All @@ -308,11 +420,17 @@ def _set_policy(self) -> Generator:
self._policy = self.synchronized_data.policy
local_tools = self.synchronized_data.available_mech_tools

if self.is_first_period:
yield from self.wait_for_condition_with_sleep(
self._fetch_accuracy_info, sleep_time_override=self.params.sleep_time
)
self._update_accuracy_store(local_tools)
remote_accuracy_info = yield from self._fetch_accuracy_info()
annasambrook marked this conversation as resolved.
Show resolved Hide resolved
overwrite_local_store = yield from self._check_local_policy_store_overwrite(
remote_accuracy_info
)
if self.is_first_period and overwrite_local_store:
yield from self._set_accuracy_info_from_remote(remote_accuracy_info)
self._update_accuracy_store(local_tools)

elif self.is_first_period:
policy = self._read_tool_accuracy_local()
self.accuracy_information = StringIO(json.dumps(policy))

def _try_recover_utilized_tools(self) -> Dict[str, str]:
"""Try to recover the utilized tools from the tools store."""
Expand Down Expand Up @@ -351,6 +469,7 @@ def _setup_policy_and_tools(self) -> Generator[None, None, bool]:
def _store_policy(self) -> None:
"""Store the policy"""
policy_path = self.params.store_path / POLICY_STORE

with open(policy_path, "w") as f:
f.write(self.policy.serialize())

Expand Down
3 changes: 3 additions & 0 deletions packages/valory/skills/decision_maker_abci/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -413,6 +413,9 @@ def __init__(self, *args: Any, **kwargs: Any) -> None:
self.service_endpoint = self._ensure("service_endpoint", kwargs, str)
self.safe_voting_range = self._ensure("safe_voting_range", kwargs, int)
self.rebet_chance = self._ensure("rebet_chance", kwargs, float)
self.policy_store_update_offset = self._ensure(
"policy_store_update_offset", kwargs, float
)
super().__init__(*args, **kwargs)

@property
Expand Down
2 changes: 2 additions & 0 deletions packages/valory/skills/decision_maker_abci/policy.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ class AccuracyInfo:
pending: int = 0
# the accuracy of the tool
accuracy: float = 0.0
# the timestamp of updating
updated_ts: int = 0


class EGreedyPolicyDecoder(json.JSONDecoder):
Expand Down
6 changes: 3 additions & 3 deletions packages/valory/skills/decision_maker_abci/skill.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,16 +25,16 @@ fingerprint:
behaviours/reedem.py: bafybeiaxwp4lx62owcaqfp6xcqh6567f5yvwnl4rage2f5hmq4nltkzjjy
behaviours/round_behaviour.py: bafybeih63hpia2bwwzu563hxs5yd3t5ycvxvkfnhvxbzghbyy3mw3xjl3i
behaviours/sampling.py: bafybeiekxzublnsvgjb2y2uvtye4zkethvmsxh4itonnwmb3sbviyyhsgq
behaviours/storage_manager.py: bafybeibnlg2eirzcxdpnuwbhzne77ear44cqwm4yae5bacgfu4vqqq7d7a
behaviours/storage_manager.py: bafybeiamzuntvgph7tgkxvoezdzip65vf6xnmu3vm5s6ftzqjzkj3zpqe4
behaviours/tool_selection.py: bafybeienlxcgjs3ogyofli3d7q3p5rst3mcxxcnwqf7qolqjeefjtixeke
dialogues.py: bafybeigpwuzku3we7axmxeamg7vn656maww6emuztau5pg3ebsoquyfdqm
fsm_specification.yaml: bafybeiabt2fonv63hozgr7bt4d5auom76iufzh6etpnmbwekktckz7644a
handlers.py: bafybeigod6gbjrxy4mbmulbzsbokeaoycoqys64vqtxnumishfukzf73za
io_/__init__.py: bafybeifxgmmwjqzezzn3e6keh2bfo4cyo7y5dq2ept3stfmgglbrzfl5rq
io_/loader.py: bafybeih3sdsx5dhe4kzhtoafexjgkutsujwqy3zcdrlrkhtdks45bc7exa
models.py: bafybeicpwbvlrj4ag3kcbhjtp6ojvy4g5ggh7zjw47iwilmmhye72lt3fy
models.py: bafybeihwg74syhibkg76vs45dvd3tm6iiyiicdncjuo6vzembwjz42o6ie
payloads.py: bafybeicloiy4ax7dlipwp4czlueflgjgtlev4a6vhn2m7ztoehnemiiko4
policy.py: bafybeihcltocxg7zsmvjtx44ilal4zir4fz2rupgmhacktzv5neb2lmas4
policy.py: bafybeict5loy6yymz6ta4lpt4v5qiy42sesanb23dfaqhagitcdnl3fmri
redeem_info.py: bafybeifiiix4gihfo4avraxt34sfw35v6dqq45do2drrssei2shbps63mm
rounds.py: bafybeihczrvkid4lqoai7myqqs4f3g5diqsnjotxtqhxhm5c7oowzifbqy
states/__init__.py: bafybeid23llnyp6j257dluxmrnztugo5llsrog7kua53hllyktz4dqhqoy
Expand Down
4 changes: 2 additions & 2 deletions packages/valory/skills/trader_abci/skill.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ skills:
- valory/transaction_settlement_abci:0.1.0:bafybeic7q7recyka272udwcupblwbkc3jkodgp74fvcdxb7urametg5dae
- valory/termination_abci:0.1.0:bafybeib5l7jhew5ic6iq24dd23nidcoimzqkrk556gqywhoziatj33zvwm
- valory/market_manager_abci:0.1.0:bafybeicia7itulcrxlwbmhfzxppgo5i33tb2nmcycwizftw7gps4dareka
- valory/decision_maker_abci:0.1.0:bafybeidcnpwi4o7z4wsenxz7tklagdchqunvmdqeyplcybwkoywmb7tvlu
- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeicdzirkebpbyhhkhordyte3gup32yt4nyfpijqihtpmceryrr5o74
- valory/decision_maker_abci:0.1.0:bafybeiaqz3fonzyiaifqjpv2c4jlbqbo2vax6cjtivkvp7i2t7jr2vi5mi
- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeicnmvvlcrqsqcbyhux4g2jxtkibgrjp7zr7h6welkfbthwerm4sau
- valory/staking_abci:0.1.0:bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4
- valory/check_stop_trading_abci:0.1.0:bafybeicsrrxjs6bup267jiek3r7eutd42ssfyjthyvxfku6qozw3xebxta
- valory/mech_interact_abci:0.1.0:bafybeid6m3i5ofq7vuogqapdnoshhq7mswmudhvfcr2craw25fdwtoe3lm
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ protocols:
- valory/ledger_api:1.0.0:bafybeihdk6psr4guxmbcrc26jr2cbgzpd5aljkqvpwo64bvaz7tdti2oni
skills:
- valory/abstract_round_abci:0.1.0:bafybeib733xfbndtpvkf44mtk7oyodnficgloo6xhn7xmqxxeos33es65u
- valory/decision_maker_abci:0.1.0:bafybeidcnpwi4o7z4wsenxz7tklagdchqunvmdqeyplcybwkoywmb7tvlu
- valory/decision_maker_abci:0.1.0:bafybeiaqz3fonzyiaifqjpv2c4jlbqbo2vax6cjtivkvp7i2t7jr2vi5mi
- valory/staking_abci:0.1.0:bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4
- valory/mech_interact_abci:0.1.0:bafybeid6m3i5ofq7vuogqapdnoshhq7mswmudhvfcr2craw25fdwtoe3lm
behaviours:
Expand Down