diff --git a/packages/valory/agents/mech/aea-config.yaml b/packages/valory/agents/mech/aea-config.yaml index da154411..99720bde 100644 --- a/packages/valory/agents/mech/aea-config.yaml +++ b/packages/valory/agents/mech/aea-config.yaml @@ -14,7 +14,7 @@ connections: - valory/p2p_libp2p_client:0.1.0:bafybeihge56dn3xep2dzomu7rtvbgo4uc2qqh7ljl3fubqdi2lq44gs5lq - valory/websocket_client:0.1.0:bafybeidxgkpajanybyjrmdnor4au4ttghzyp2ulgm7rttjgopxrjoaszzi contracts: -- valory/agent_mech:0.1.0:bafybeihl5bhzztik6iylqyuzbci2nxvlj6f7hybspxgrvlrik7szrlsxfa +- valory/agent_mech:0.1.0:bafybeic7l75wn3nrjf24lddqngpolalbhjh7su6mttmuebqxgh4veqegia - valory/gnosis_safe:0.1.0:bafybeibt7arvjzz4ah24omst74f4sfjpzrdef76yti6ml7dopsauhdzeci - valory/gnosis_safe_proxy_factory:0.1.0:bafybeigxqwbd6wds57ecsfkl2hf4z4vbz5gokex6nutu5zcdpw6irh573y - valory/multisend:0.1.0:bafybeig5byt5urg2d2bsecufxe5ql7f4mezg3mekfleeh32nmuusx66p4y @@ -35,11 +35,11 @@ skills: - valory/abstract_abci:0.1.0:bafybeihgemn2gwjc2wyxuh7rttg5pk5gec7dxhet3ih2tmg75vsdbgad7a - valory/abstract_round_abci:0.1.0:bafybeic3xbxh74qaufevlmuwj64hhzyvp6ne24ffmbdauset52z7app2cu - valory/contract_subscription:0.1.0:bafybeiedubkfhzjrg2wpuseham25ml54dmpcfc3vuaha6cl3fvar4b3qai -- valory/mech_abci:0.1.0:bafybeiezaqnzlkcqa3ezycg72go7bpphlreror65nyrx2cc3n4bx4tbumi -- valory/task_execution:0.1.0:bafybeibbchr6ibv3asncoatmrr46jxfsf6kr4whlfxfxqpmnl57enb6r2a +- valory/mech_abci:0.1.0:bafybeifyj7mpoupexuw5ozwucstooznwzjqei5xh3x6aqbahmhsfxock2y +- valory/task_execution:0.1.0:bafybeiaomsbxkugiplv76cjwbkqnbsoq4nw2pmq5ywgxmsxy7o52zz3rzq - valory/registration_abci:0.1.0:bafybeigqxnmblvehj4cbhywmjbvivf44ru23xyizf7gx4wfkygkubwex24 - valory/reset_pause_abci:0.1.0:bafybeifdul36ucwer665cljtb4233fzedxkxfgi7fwflhmlsr2efhu4eiq -- valory/task_submission_abci:0.1.0:bafybeia7mbsfyupjioyyn3zsarlp337ln463jhhozowagdbugaytk77u2y +- valory/task_submission_abci:0.1.0:bafybeif3iq7a424o4uldemtlfzsbohewlktb65mllwxgg5t4q5mieuew34 - valory/termination_abci:0.1.0:bafybeihnp324qgyypecaol4tqt7bugbvpbut4hw5brbckbhpovenfiw3zu - valory/transaction_settlement_abci:0.1.0:bafybeidbodazeikfo24pug3ir44ub265ltmepm752mzkuic4qfhkdcckmm default_ledger: ethereum @@ -92,6 +92,12 @@ dependencies: version: ==2.1.1 hypothesis: version: ==6.21.6 + spacy: + version: ==3.7.2 + tiktoken: + version: ==0.5.1 + python-dateutil: + version: ==2.8.2 default_connection: null --- public_id: valory/websocket_client:0.1.0:bafybeiexove4oqyhoae5xmk2hilskthosov5imdp65olpgj3cfrepbouyy @@ -154,7 +160,7 @@ models: tendermint_max_retries: ${int:5} tendermint_url: ${str:http://localhost:26657} use_termination: ${bool:false} - agent_mech_contract_address: ${str:0xFf82123dFB52ab75C417195c5fDB87630145ae81} + agent_mech_contract_addresses: ${list:["0xFf82123dFB52ab75C417195c5fDB87630145ae81"]} round_timeout_seconds: ${float:30.0} reset_period_count: ${int:1000} on_chain_service_id: ${int:1} @@ -174,7 +180,7 @@ type: skill models: params: args: - agent_mech_contract_address: ${str:0xFf82123dFB52ab75C417195c5fDB87630145ae81} + agent_mech_contract_addresses: ${list:["0xFf82123dFB52ab75C417195c5fDB87630145ae81"]} task_deadline: ${float:240.0} file_hash_to_tools_json: ${list:[["bafybeibi34bhbvesmvd6o24jxvuldrwen4wj62na3lhva7k4afkg2shinu",["openai-text-davinci-002","openai-text-davinci-003","openai-gpt-3.5-turbo","openai-gpt-4"]],["bafybeiafdm3jctiz6wwo3rmo3vdubk7j7l5tumoxi5n5rc3x452mtkgyua",["stabilityai-stable-diffusion-v1-5","stabilityai-stable-diffusion-xl-beta-v2-2-2","stabilityai-stable-diffusion-512-v2-1","stabilityai-stable-diffusion-768-v2-1"]],["bafybeidpbnqbruzqlq424qt3i5dcvyqmcimshjilftabnrroujmjhdmteu",["transfer-native"]],["bafybeiglhy5epaytvt5qqdx77ld23ekouli53qrf2hjyebd5xghlunidfi",["prediction-online","prediction-offline"]]]} api_keys_json: ${list:[["openai", "dummy_api_key"],["stabilityai", "dummy_api_key"],["google_api_key", diff --git a/packages/valory/contracts/agent_mech/contract.py b/packages/valory/contracts/agent_mech/contract.py index d1bb4c4f..a29cdd71 100644 --- a/packages/valory/contracts/agent_mech/contract.py +++ b/packages/valory/contracts/agent_mech/contract.py @@ -128,6 +128,7 @@ def get_request_events( { "tx_hash": entry.transactionHash.hex(), "block_number": entry.blockNumber, + "contract_address": contract_address, **entry["args"], } for entry in entries @@ -183,3 +184,23 @@ def get_undelivered_reqs( # store each requests in the pending_tasks list, make sure each req is stored once pending_tasks.append(request) return {"data": pending_tasks} + + @classmethod + def get_multiple_undelivered_reqs( + cls, + ledger_api: LedgerApi, + contract_address: str, + contract_addresses: List[str], + from_block: BlockIdentifier = "earliest", + **kwargs: Any, + ) -> JSONLike: + """Get the requests that are not delivered.""" + pending_tasks: List[Dict[str, Any]] = [] + # ensure we get the same range on all contracts + to_block = ledger_api.api.eth.block_number + for contract_address in contract_addresses: + pending_tasks_batch = cls.get_undelivered_reqs( + ledger_api, contract_address, from_block, to_block + ).get("data") + pending_tasks.extend(pending_tasks_batch) + return {"data": pending_tasks} diff --git a/packages/valory/contracts/agent_mech/contract.yaml b/packages/valory/contracts/agent_mech/contract.yaml index f7faa66d..327effe3 100644 --- a/packages/valory/contracts/agent_mech/contract.yaml +++ b/packages/valory/contracts/agent_mech/contract.yaml @@ -8,7 +8,7 @@ aea_version: '>=1.0.0, <2.0.0' fingerprint: __init__.py: bafybeigpq5lxfj2aza6ok3fjuywtdafelkbvoqwaits7regfbgu4oynmku build/AgentMech.json: bafybeidrlu7vpusp2tzovyf5rbnqy2jicuq3e6czizfkzswjq4rjusu72i - contract.py: bafybeia4e7nbxuqoqbtxolapvn5z35ryfjnoldrd4zr2cbv5ewa44tohme + contract.py: bafybeibexkfobufuooyzton3up7nq7alr2wlinkflegpsa7tnvafcdzk34 fingerprint_ignore_patterns: [] class_name: AgentMechContract contract_interface_paths: diff --git a/packages/valory/services/mech/service.yaml b/packages/valory/services/mech/service.yaml index d105323c..ecd604e1 100644 --- a/packages/valory/services/mech/service.yaml +++ b/packages/valory/services/mech/service.yaml @@ -7,7 +7,7 @@ license: Apache-2.0 fingerprint: README.md: bafybeif7ia4jdlazy6745ke2k2x5yoqlwsgwr6sbztbgqtwvs3ndm2p7ba fingerprint_ignore_patterns: [] -agent: valory/mech:0.1.0:bafybeiah5xgb7fpzln6sqqbj4leqsdunh6jxes3ripum7a22csuiw5miy4 +agent: valory/mech:0.1.0:bafybeig23wynkrigqg4jbxzpgejotrcbbj6obfzpzqqs6zpcewcml5dxn4 number_of_agents: 4 deployment: agent: @@ -43,7 +43,7 @@ type: skill tendermint_p2p_url: ${TM_P2P_ENDPOINT_NODE_0:str:node0:26656} termination_sleep: ${TERMINATION_SLEEP:int:900} use_termination: ${USE_TERMINATION:bool:false} - agent_mech_contract_address: ${AGENT_MECH_CONTRACT_ADDRESS:str:0xFf82123dFB52ab75C417195c5fDB87630145ae81} + agent_mech_contract_address: ${AGENT_MECH_CONTRACT_ADDRESSES:list:["0xFf82123dFB52ab75C417195c5fDB87630145ae81","0x77af31De935740567Cf4fF1986D04B2c964A786a"]} reset_period_count: ${RESET_PERIOD_COUNT:int:1000} use_slashing: ${USE_SLASHING:bool:false} slash_cooldown_hours: ${SLASH_COOLDOWN_HOURS:int:3} @@ -70,7 +70,7 @@ type: skill tendermint_p2p_url: ${TM_P2P_ENDPOINT_NODE_0:str:node0:26656} termination_sleep: ${TERMINATION_SLEEP:int:900} use_termination: ${USE_TERMINATION:bool:false} - agent_mech_contract_address: ${AGENT_MECH_CONTRACT_ADDRESS:str:0xFf82123dFB52ab75C417195c5fDB87630145ae81} + agent_mech_contract_address: ${AGENT_MECH_CONTRACT_ADDRESSES:list:["0xFf82123dFB52ab75C417195c5fDB87630145ae81","0x77af31De935740567Cf4fF1986D04B2c964A786a"]} reset_period_count: ${RESET_PERIOD_COUNT:int:1000} use_slashing: ${USE_SLASHING:bool:false} slash_cooldown_hours: ${SLASH_COOLDOWN_HOURS:int:3} @@ -97,7 +97,7 @@ type: skill tendermint_p2p_url: ${TM_P2P_ENDPOINT_NODE_0:str:node0:26656} termination_sleep: ${TERMINATION_SLEEP:int:900} use_termination: ${USE_TERMINATION:bool:false} - agent_mech_contract_address: ${AGENT_MECH_CONTRACT_ADDRESS:str:0xFf82123dFB52ab75C417195c5fDB87630145ae81} + agent_mech_contract_address: ${AGENT_MECH_CONTRACT_ADDRESSES:list:["0xFf82123dFB52ab75C417195c5fDB87630145ae81","0x77af31De935740567Cf4fF1986D04B2c964A786a"]} reset_period_count: ${RESET_PERIOD_COUNT:int:1000} use_slashing: ${USE_SLASHING:bool:false} slash_cooldown_hours: ${SLASH_COOLDOWN_HOURS:int:3} @@ -124,7 +124,7 @@ type: skill tendermint_p2p_url: ${TM_P2P_ENDPOINT_NODE_0:str:node0:26656} termination_sleep: ${TERMINATION_SLEEP:int:900} use_termination: ${USE_TERMINATION:bool:false} - agent_mech_contract_address: ${AGENT_MECH_CONTRACT_ADDRESS:str:0xFf82123dFB52ab75C417195c5fDB87630145ae81} + agent_mech_contract_address: ${AGENT_MECH_CONTRACT_ADDRESSES:list:["0xFf82123dFB52ab75C417195c5fDB87630145ae81","0x77af31De935740567Cf4fF1986D04B2c964A786a"]} reset_period_count: ${RESET_PERIOD_COUNT:int:1000} use_slashing: ${USE_SLASHING:bool:false} slash_cooldown_hours: ${SLASH_COOLDOWN_HOURS:int:3} @@ -141,7 +141,7 @@ type: skill models: params: args: - agent_mech_contract_address: ${AGENT_MECH_CONTRACT_ADDRESS:str:0xFf82123dFB52ab75C417195c5fDB87630145ae81} + agent_mech_contract_address: ${AGENT_MECH_CONTRACT_ADDRESSES:list:["0xFf82123dFB52ab75C417195c5fDB87630145ae81","0x77af31De935740567Cf4fF1986D04B2c964A786a"]} task_deadline: ${TASK_DEADLINE:float:240.0} file_hash_to_tools_json: ${FILE_HASH_TO_TOOLS:list:[]} api_keys_json: ${API_KEYS:list:[]} @@ -152,7 +152,7 @@ type: skill models: params: args: - agent_mech_contract_address: ${AGENT_MECH_CONTRACT_ADDRESS:str:0xFf82123dFB52ab75C417195c5fDB87630145ae81} + agent_mech_contract_address: ${AGENT_MECH_CONTRACT_ADDRESSES:list:["0xFf82123dFB52ab75C417195c5fDB87630145ae81","0x77af31De935740567Cf4fF1986D04B2c964A786a"]} task_deadline: ${TASK_DEADLINE:float:240.0} file_hash_to_tools_json: ${FILE_HASH_TO_TOOLS:list:[]} api_keys_json: ${API_KEYS:list:[]} @@ -163,7 +163,7 @@ type: skill models: params: args: - agent_mech_contract_address: ${AGENT_MECH_CONTRACT_ADDRESS:str:0xFf82123dFB52ab75C417195c5fDB87630145ae81} + agent_mech_contract_address: ${AGENT_MECH_CONTRACT_ADDRESSES:list:["0xFf82123dFB52ab75C417195c5fDB87630145ae81","0x77af31De935740567Cf4fF1986D04B2c964A786a"]} task_deadline: ${TASK_DEADLINE:float:240.0} file_hash_to_tools_json: ${FILE_HASH_TO_TOOLS:list:[]} api_keys_json: ${API_KEYS:list:[]} @@ -174,7 +174,7 @@ type: skill models: params: args: - agent_mech_contract_address: ${AGENT_MECH_CONTRACT_ADDRESS:str:0xFf82123dFB52ab75C417195c5fDB87630145ae81} + agent_mech_contract_address: ${AGENT_MECH_CONTRACT_ADDRESSES:list:["0xFf82123dFB52ab75C417195c5fDB87630145ae81","0x77af31De935740567Cf4fF1986D04B2c964A786a"]} task_deadline: ${TASK_DEADLINE:float:240.0} file_hash_to_tools_json: ${FILE_HASH_TO_TOOLS:list:[]} api_keys_json: ${API_KEYS:list:[]} diff --git a/packages/valory/skills/mech_abci/skill.yaml b/packages/valory/skills/mech_abci/skill.yaml index 6c39c448..5ec769f3 100644 --- a/packages/valory/skills/mech_abci/skill.yaml +++ b/packages/valory/skills/mech_abci/skill.yaml @@ -21,7 +21,7 @@ skills: - valory/abstract_round_abci:0.1.0:bafybeic3xbxh74qaufevlmuwj64hhzyvp6ne24ffmbdauset52z7app2cu - valory/registration_abci:0.1.0:bafybeigqxnmblvehj4cbhywmjbvivf44ru23xyizf7gx4wfkygkubwex24 - valory/reset_pause_abci:0.1.0:bafybeifdul36ucwer665cljtb4233fzedxkxfgi7fwflhmlsr2efhu4eiq -- valory/task_submission_abci:0.1.0:bafybeia7mbsfyupjioyyn3zsarlp337ln463jhhozowagdbugaytk77u2y +- valory/task_submission_abci:0.1.0:bafybeif3iq7a424o4uldemtlfzsbohewlktb65mllwxgg5t4q5mieuew34 - valory/termination_abci:0.1.0:bafybeihnp324qgyypecaol4tqt7bugbvpbut4hw5brbckbhpovenfiw3zu - valory/transaction_settlement_abci:0.1.0:bafybeidbodazeikfo24pug3ir44ub265ltmepm752mzkuic4qfhkdcckmm behaviours: @@ -75,7 +75,8 @@ models: class_name: LedgerApiDialogues params: args: - agent_mech_contract_address: '0xFf82123dFB52ab75C417195c5fDB87630145ae81' + agent_mech_contract_addresses: + - '0xFf82123dFB52ab75C417195c5fDB87630145ae81' api_keys_json: - - openai - dummy_api_key diff --git a/packages/valory/skills/task_execution/behaviours.py b/packages/valory/skills/task_execution/behaviours.py index 106d0970..77c4b370 100644 --- a/packages/valory/skills/task_execution/behaviours.py +++ b/packages/valory/skills/task_execution/behaviours.py @@ -199,14 +199,17 @@ def _check_for_new_reqs(self) -> None: # set the initial from block self._populate_from_block() return - contract_api_msg, _ = self.context.contract_dialogues.create( performative=ContractApiMessage.Performative.GET_STATE, - contract_address=self.params.agent_mech_contract_address, + contract_address=self.params.agent_mech_contract_addresses[0], contract_id=str(AgentMechContract.contract_id), - callable="get_undelivered_reqs", + callable="get_multiple_undelivered_reqs", kwargs=ContractApiMessage.Kwargs( - dict(from_block=self.params.from_block, chain_id=GNOSIS_CHAIN) + dict( + from_block=self.params.from_block, + chain_id=GNOSIS_CHAIN, + contract_addresses=self.params.agent_mech_contract_addresses, + ) ), counterparty=LEDGER_API_ADDRESS, ledger_id=self.context.default_ledger_id, @@ -256,9 +259,10 @@ def _handle_done_task(self) -> None: """Handle done tasks""" executing_task = cast(Dict[str, Any], self._executing_task) req_id = executing_task.get("requestId", None) + mech_address = executing_task.get("contract_address", None) task_result = self._get_executing_task_result() response = {"requestId": req_id, "result": "Invalid response"} - self._done_task = {"request_id": req_id} + self._done_task = {"request_id": req_id, "mech_address": mech_address} if task_result is not None: # task succeeded deliver_msg, prompt, transaction = task_result diff --git a/packages/valory/skills/task_execution/models.py b/packages/valory/skills/task_execution/models.py index 5a8df00b..2b032ac5 100644 --- a/packages/valory/skills/task_execution/models.py +++ b/packages/valory/skills/task_execution/models.py @@ -29,12 +29,12 @@ class Params(Model): def __init__(self, *args: Any, **kwargs: Any) -> None: """Initialize the parameters object.""" - self.agent_mech_contract_address = kwargs.get( - "agent_mech_contract_address", None + self.agent_mech_contract_addresses = kwargs.get( + "agent_mech_contract_addresses", None ) enforce( - self.agent_mech_contract_address is not None, - "agent_mech_contract_address must be set!", + self.agent_mech_contract_addresses is not None, + "agent_mech_contract_addresses must be set!", ) self.in_flight_req: bool = False diff --git a/packages/valory/skills/task_execution/skill.yaml b/packages/valory/skills/task_execution/skill.yaml index 5d6845f6..00df2f40 100644 --- a/packages/valory/skills/task_execution/skill.yaml +++ b/packages/valory/skills/task_execution/skill.yaml @@ -7,10 +7,10 @@ license: Apache-2.0 aea_version: '>=1.0.0, <2.0.0' fingerprint: __init__.py: bafybeidqhvvlnthkbnmrdkdeyjyx2f2ab6z4xdgmagh7welqnh2v6wczx4 - behaviours.py: bafybeiaxbc7esaphfdc3pgmvwghqloouwk45k3sg5xdhaa7mnadms4ivve + behaviours.py: bafybeibrvfpdvcdtel3juuxjcbtvrwazgdg3na5h4fzh2akfldk2eipudq dialogues.py: bafybeid4zxalqdlo5mw4yfbuf34hx4jp5ay5z6chm4zviwu4cj7fudtwca handlers.py: bafybeidbt5ezj74cgfogk3w4uw4si2grlnk5g54veyumw7g5yh6gdscywu - models.py: bafybeibfaxjdlwlpmv4ursoyfvo4k6lp442fyzxxvl7vsw5pyssgxartbm + models.py: bafybeiavbz7un34qpxbmi3bmvk7yogc4w7d5wd3eymonelsqep5li222y4 utils/__init__.py: bafybeiccdijaigu6e5p2iruwo5mkk224o7ywedc7nr6xeu5fpmhjqgk24e utils/ipfs.py: bafybeicuaj23qrcdv6ly4j7yo6il2r5plozhd6mwvcp5acwqbjxb2t3u2i utils/task.py: bafybeiakokty64m5cqp72drrpvfckhruldlwcge5hcc2bsy2ujk6nnrazq @@ -20,7 +20,7 @@ connections: - valory/ipfs:0.1.0:bafybeigkn27u7m5atju6a724clycyfshbgcbwheztil2bky7krfa46ub2a - valory/p2p_libp2p_client:0.1.0:bafybeihge56dn3xep2dzomu7rtvbgo4uc2qqh7ljl3fubqdi2lq44gs5lq contracts: -- valory/agent_mech:0.1.0:bafybeihl5bhzztik6iylqyuzbci2nxvlj6f7hybspxgrvlrik7szrlsxfa +- valory/agent_mech:0.1.0:bafybeic7l75wn3nrjf24lddqngpolalbhjh7su6mttmuebqxgh4veqegia protocols: - valory/acn_data_share:0.1.0:bafybeieyixetwvz767zekhvg7r6etumyanzys6xbalx2brrfswybinnlhi - valory/contract_api:1.0.0:bafybeialhbjvwiwcnqq3ysxcyemobcbie7xza66gaofcvla5njezkvhcka @@ -64,7 +64,8 @@ models: params: args: agent_index: 0 - agent_mech_contract_address: '0x9A676e781A523b5d0C0e43731313A708CB607508' + agent_mech_contract_addresses: + - '0x9A676e781A523b5d0C0e43731313A708CB607508' api_keys_json: - - openai - dummy_api_key diff --git a/packages/valory/skills/task_submission_abci/behaviours.py b/packages/valory/skills/task_submission_abci/behaviours.py index 37acbd09..af2ce200 100644 --- a/packages/valory/skills/task_submission_abci/behaviours.py +++ b/packages/valory/skills/task_submission_abci/behaviours.py @@ -297,7 +297,7 @@ def _get_deliver_tx( """Get the deliver tx.""" contract_api_msg = yield from self.get_contract_api_response( performative=ContractApiMessage.Performative.GET_STATE, # type: ignore - contract_address=self.params.agent_mech_contract_address, + contract_address=task_data["mech_address"], contract_id=str(AgentMechContract.contract_id), contract_callable="get_deliver_data", request_id=task_data["request_id"], @@ -313,7 +313,7 @@ def _get_deliver_tx( data = cast(bytes, contract_api_msg.state.body["data"]) return { - "to": self.params.agent_mech_contract_address, + "to": task_data["mech_address"], "value": ZERO_ETHER_VALUE, "data": data, } diff --git a/packages/valory/skills/task_submission_abci/models.py b/packages/valory/skills/task_submission_abci/models.py index a6bfc2ed..82bffe86 100644 --- a/packages/valory/skills/task_submission_abci/models.py +++ b/packages/valory/skills/task_submission_abci/models.py @@ -57,11 +57,6 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: self.multisend_address = kwargs.get("multisend_address", None) if self.multisend_address is None: raise ValueError("No multisend_address specified!") - self.agent_mech_contract_address = kwargs.get( - "agent_mech_contract_address", None - ) - if self.agent_mech_contract_address is None: - raise ValueError("agent_mech_contract_address is required") self.agent_registry_address = self._ensure( "agent_registry_address", kwargs, str ) diff --git a/packages/valory/skills/task_submission_abci/skill.yaml b/packages/valory/skills/task_submission_abci/skill.yaml index cbcae1bb..2fda347a 100644 --- a/packages/valory/skills/task_submission_abci/skill.yaml +++ b/packages/valory/skills/task_submission_abci/skill.yaml @@ -8,18 +8,18 @@ license: Apache-2.0 aea_version: '>=1.0.0, <2.0.0' fingerprint: __init__.py: bafybeiholqak7ltw6bbmn2c5tn3j7xgzkdlfzp3kcskiqsvmxoih6m4muq - behaviours.py: bafybeicqny46ccyh5tr7wfiplld4o5wp6ibqn5afkp3e3po353vwua255e + behaviours.py: bafybeicl5hj7pvoj3tmyj4hvvlmliktbmrvrhfl2sljccj7socrpoiegje dialogues.py: bafybeibmac3m5u5h6ucoyjr4dazay72dyga656wvjl6z6saapluvjo54ne fsm_specification.yaml: bafybeig6bhn554qyou7kef5bstnlv54zke32avyti63uu4hvsol3lzqkoi handlers.py: bafybeibe5n7my2vd2wlwo73sbma65epjqc7kxgtittewlylcmvnmoxtxzq - models.py: bafybeibwa7xffrsi6np4o2gvin5a7a6arlbpkizazoq4fjb2b4kdrja5si + models.py: bafybeib4sgwtutuj6dydoi6q5rrfoj5nvvkb7cyzsipxk2yrmrhuocuoni payloads.py: bafybeia2yorri2u5rwh6vukb6iwdrbn53ygsuuhthns2txptvjipyb6f4e rounds.py: bafybeicstmau4vlzpxz3kjgiwwsetwmotdk4un4iucmdddzvot5dgdkg2a tasks.py: bafybeicu5t5cvfhbndgpxbbtmp4vbmtyb6fba6vsnlewftvuderxp5lwcy fingerprint_ignore_patterns: [] connections: [] contracts: -- valory/agent_mech:0.1.0:bafybeihl5bhzztik6iylqyuzbci2nxvlj6f7hybspxgrvlrik7szrlsxfa +- valory/agent_mech:0.1.0:bafybeic7l75wn3nrjf24lddqngpolalbhjh7su6mttmuebqxgh4veqegia - valory/agent_registry:0.1.0:bafybeiargayav6yiztdnwzejoejstcx4idssch2h4f5arlgtzj3tgsgfmu - valory/gnosis_safe:0.1.0:bafybeibt7arvjzz4ah24omst74f4sfjpzrdef76yti6ml7dopsauhdzeci - valory/multisend:0.1.0:bafybeig5byt5urg2d2bsecufxe5ql7f4mezg3mekfleeh32nmuusx66p4y