From 2b468fdc02ac7fa4cf25d45ff9fb98a5942da717 Mon Sep 17 00:00:00 2001 From: Ojuswi Rastogi Date: Mon, 2 Jun 2025 16:43:10 +0530 Subject: [PATCH 1/3] Refactor: Remove unused `staked` and `on_chain_state` Signed-off-by: Ojuswi Rastogi --- operate/operate_types.py | 2 - operate/services/manage.py | 88 +++++++++------------------------- operate/services/service.py | 9 ---- tests/test_services_service.py | 14 ------ 4 files changed, 23 insertions(+), 90 deletions(-) diff --git a/operate/operate_types.py b/operate/operate_types.py index 7d7d74aa2..c16561797 100644 --- a/operate/operate_types.py +++ b/operate/operate_types.py @@ -295,8 +295,6 @@ class OnChainData(LocalResource): instances: t.List[str] # Agent instances registered as safe owners token: int multisig: str - staked: bool - on_chain_state: OnChainState user_params: OnChainUserParams diff --git a/operate/services/manage.py b/operate/services/manage.py index 15cb6bc06..10ddca835 100644 --- a/operate/services/manage.py +++ b/operate/services/manage.py @@ -277,17 +277,11 @@ def _get_on_chain_state(self, service: Service, chain: str) -> OnChainState: chain_data = chain_config.chain_data ledger_config = chain_config.ledger_config if chain_data.token == NON_EXISTENT_TOKEN: - service_state = OnChainState.NON_EXISTENT - chain_data.on_chain_state = service_state - service.store() - return service_state + return OnChainState.NON_EXISTENT sftxb = self.get_eth_safe_tx_builder(ledger_config=ledger_config) info = sftxb.info(token_id=chain_data.token) - service_state = OnChainState(info["service_state"]) - chain_data.on_chain_state = service_state - service.store() - return service_state + return OnChainState(info["service_state"]) def _get_on_chain_metadata(self, chain_config: ChainConfig) -> t.Dict: chain_data = chain_config.chain_data @@ -346,11 +340,11 @@ def _deploy_service_onchain( # pylint: disable=too-many-statements,too-many-loc if chain_data.token > -1: self.logger.info("Syncing service state") info = ocm.info(token_id=chain_data.token) - chain_data.on_chain_state = OnChainState(info["service_state"]) + on_chain_state = OnChainState(info["service_state"]) chain_data.instances = info["instances"] chain_data.multisig = info["multisig"] service.store() - self.logger.info(f"Service state: {chain_data.on_chain_state.name}") + self.logger.info(f"Service state: {on_chain_state.name}") if user_params.use_staking: staking_params = ocm.get_staking_params( @@ -375,7 +369,7 @@ def _deploy_service_onchain( # pylint: disable=too-many-statements,too-many-loc # TODO: Missing check when the service is currently staked in a program, but needs to be staked # in a different target program. The In this case, balance = currently staked balance + safe balance - if chain_data.on_chain_state in ( + if on_chain_state in ( OnChainState.NON_EXISTENT, OnChainState.PRE_REGISTRATION, ): @@ -383,7 +377,7 @@ def _deploy_service_onchain( # pylint: disable=too-many-statements,too-many-loc staking_params["min_staking_deposit"] + staking_params["min_staking_deposit"] # bond = staking ) - elif chain_data.on_chain_state == OnChainState.ACTIVE_REGISTRATION: + elif on_chain_state == OnChainState.ACTIVE_REGISTRATION: required_olas = staking_params["min_staking_deposit"] else: required_olas = 0 @@ -434,7 +428,7 @@ def _deploy_service_onchain( # pylint: disable=too-many-statements,too-many-loc self.logger.info(f"{is_first_mint=}") self.logger.info(f"{is_update=}") - if chain_data.on_chain_state == OnChainState.NON_EXISTENT: + if on_chain_state == OnChainState.NON_EXISTENT: self.logger.info("Minting service") chain_data.token = t.cast( int, @@ -457,25 +451,24 @@ def _deploy_service_onchain( # pylint: disable=too-many-statements,too-many-loc skip_dependency_check=self.skip_depencency_check, ).get("token"), ) - chain_data.on_chain_state = OnChainState.PRE_REGISTRATION + on_chain_state = OnChainState.PRE_REGISTRATION service.store() info = ocm.info(token_id=chain_data.token) - chain_data.on_chain_state = OnChainState(info["service_state"]) + on_chain_state = OnChainState(info["service_state"]) - if chain_data.on_chain_state == OnChainState.PRE_REGISTRATION: + if on_chain_state == OnChainState.PRE_REGISTRATION: self.logger.info("Activating service") ocm.activate( service_id=chain_data.token, token=(OLAS[ledger_config.chain] if user_params.use_staking else None), ) - chain_data.on_chain_state = OnChainState.ACTIVE_REGISTRATION - service.store() + on_chain_state = OnChainState.ACTIVE_REGISTRATION info = ocm.info(token_id=chain_data.token) - chain_data.on_chain_state = OnChainState(info["service_state"]) + on_chain_state = OnChainState(info["service_state"]) - if chain_data.on_chain_state == OnChainState.ACTIVE_REGISTRATION: + if on_chain_state == OnChainState.ACTIVE_REGISTRATION: self.logger.info("Registering agent instances") agent_id = staking_params["agent_ids"][0] ocm.register( @@ -484,29 +477,25 @@ def _deploy_service_onchain( # pylint: disable=too-many-statements,too-many-loc agents=[agent_id for _ in instances], token=(OLAS[ledger_config.chain] if user_params.use_staking else None), ) - chain_data.on_chain_state = OnChainState.FINISHED_REGISTRATION - service.store() + on_chain_state = OnChainState.FINISHED_REGISTRATION info = ocm.info(token_id=chain_data.token) - chain_data.on_chain_state = OnChainState(info["service_state"]) + on_chain_state = OnChainState(info["service_state"]) - if chain_data.on_chain_state == OnChainState.FINISHED_REGISTRATION: + if on_chain_state == OnChainState.FINISHED_REGISTRATION: self.logger.info("Deploying service") ocm.deploy( service_id=chain_data.token, reuse_multisig=is_update, token=(OLAS[ledger_config.chain] if user_params.use_staking else None), ) - chain_data.on_chain_state = OnChainState.DEPLOYED - service.store() + on_chain_state = OnChainState.DEPLOYED info = ocm.info(token_id=chain_data.token) chain_data = OnChainData( token=chain_data.token, instances=info["instances"], multisig=info["multisig"], - staked=False, - on_chain_state=chain_data.on_chain_state, user_params=chain_data.user_params, ) service.store() @@ -551,12 +540,12 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to if chain_data.token > -1: self.logger.info("Syncing service state") info = sftxb.info(token_id=chain_data.token) - chain_data.on_chain_state = OnChainState(info["service_state"]) + on_chain_state = OnChainState(info["service_state"]) chain_data.instances = info["instances"] chain_data.multisig = info["multisig"] current_agent_id = info["canonical_agents"][0] # TODO Allow multiple agents service.store() - self.logger.info(f"Service state: {chain_data.on_chain_state.name}") + self.logger.info(f"Service state: {on_chain_state.name}") current_staking_program = self._get_current_staking_program(service, chain) fallback_params = dict( # nosec @@ -704,14 +693,14 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to # TODO: Missing check when the service is currently staked in a program, but needs to be staked # in a different target program. The In this case, balance = currently staked balance + safe balance - if chain_data.on_chain_state in ( + if on_chain_state in ( OnChainState.NON_EXISTENT, OnChainState.PRE_REGISTRATION, ): protocol_asset_requirements = self._compute_protocol_asset_requirements( service_config_id, chain ) - elif chain_data.on_chain_state == OnChainState.ACTIVE_REGISTRATION: + elif on_chain_state == OnChainState.ACTIVE_REGISTRATION: protocol_asset_requirements = self._compute_protocol_asset_requirements( service_config_id, chain ) @@ -828,8 +817,6 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to receipt=receipt, ).get("events"), ) - chain_data.on_chain_state = OnChainState.PRE_REGISTRATION - service.store() # Mint service if ( @@ -881,7 +868,6 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to ).get("events"), ) chain_data.token = event_data["args"]["serviceId"] - chain_data.on_chain_state = OnChainState.PRE_REGISTRATION service.store() if ( @@ -946,8 +932,6 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to cost_of_bond=cost_of_bond, ) ).settle() - chain_data.on_chain_state = OnChainState.ACTIVE_REGISTRATION - service.store() if ( self._get_on_chain_state(service=service, chain=chain) @@ -1014,8 +998,6 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to cost_of_bond=cost_of_bond, ) ).settle() - chain_data.on_chain_state = OnChainState.FINISHED_REGISTRATION - service.store() if ( self._get_on_chain_state(service=service, chain=chain) @@ -1040,14 +1022,10 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to tx.add(message) tx.settle() - chain_data.on_chain_state = OnChainState.DEPLOYED - service.store() - # Update local Service info = sftxb.info(token_id=chain_data.token) chain_data.instances = info["instances"] chain_data.multisig = info["multisig"] - chain_data.on_chain_state = OnChainState(info["service_state"]) # TODO: yet another agent specific logic for mech, which should be abstracted if all( @@ -1137,9 +1115,8 @@ def terminate_service_on_chain( chain_data = chain_config.chain_data ocm = self.get_on_chain_manager(ledger_config=ledger_config) info = ocm.info(token_id=chain_data.token) - chain_data.on_chain_state = OnChainState(info["service_state"]) - if chain_data.on_chain_state != OnChainState.DEPLOYED: + if OnChainState(info["service_state"]) != OnChainState.DEPLOYED: self.logger.info("Cannot terminate service") return @@ -1152,8 +1129,6 @@ def terminate_service_on_chain( else None ), ) - chain_data.on_chain_state = OnChainState.TERMINATED_BONDED - service.store() def terminate_service_on_chain_from_safe( # pylint: disable=too-many-locals self, @@ -1177,8 +1152,6 @@ def terminate_service_on_chain_from_safe( # pylint: disable=too-many-locals os.environ["CUSTOM_CHAIN_RPC"] = ledger_config.rpc sftxb = self.get_eth_safe_tx_builder(ledger_config=ledger_config) - info = sftxb.info(token_id=chain_data.token) - chain_data.on_chain_state = OnChainState(info["service_state"]) # Determine if the service is staked in a known staking program current_staking_program = self._get_current_staking_program( @@ -1385,9 +1358,8 @@ def unbond_service_on_chain( chain_data = chain_config.chain_data ocm = self.get_on_chain_manager(ledger_config=ledger_config) info = ocm.info(token_id=chain_data.token) - chain_data.on_chain_state = OnChainState(info["service_state"]) - if chain_data.on_chain_state != OnChainState.TERMINATED_BONDED: + if OnChainState(info["service_state"]) != OnChainState.TERMINATED_BONDED: self.logger.info("Cannot unbond service") return @@ -1400,8 +1372,6 @@ def unbond_service_on_chain( else None ), ) - chain_data.on_chain_state = OnChainState.UNBONDED - service.store() def stake_service_on_chain(self, hash: str) -> None: """ @@ -1464,8 +1434,6 @@ def stake_service_on_chain_from_safe( # pylint: disable=too-many-statements,too staking_program_id=current_staking_program, ) - info = sftxb.info(token_id=chain_config.chain_data.token) - chain_config.chain_data.on_chain_state = OnChainState(info["service_state"]) staking_state = sftxb.staking_status( service_id=chain_data.token, staking_contract=current_staking_contract, @@ -1591,8 +1559,6 @@ def stake_service_on_chain_from_safe( # pylint: disable=too-many-statements,too staking_contract=target_staking_contract, ) ).settle() - chain_config.chain_data.staked = True - service.store() current_staking_program = self._get_current_staking_program( service, @@ -1623,8 +1589,6 @@ def unstake_service_on_chain( self.logger.info(f"Staking status for service {chain_data.token}: {state}") if state not in {StakingState.STAKED, StakingState.EVICTED}: self.logger.info("Cannot unstake service, it's not staked") - chain_data.staked = False - service.store() return self.logger.info(f"Unstaking service: {chain_data.token}") @@ -1635,8 +1599,6 @@ def unstake_service_on_chain( staking_program_id=chain_data.user_params.staking_program_id, ), ) - chain_data.staked = False - service.store() def unstake_service_on_chain_from_safe( self, @@ -1670,8 +1632,6 @@ def unstake_service_on_chain_from_safe( self.logger.info(f"Staking status for service {chain_data.token}: {state}") if state not in {StakingState.STAKED, StakingState.EVICTED}: self.logger.info("Cannot unstake service, it's not staked") - chain_data.staked = False - service.store() return self.logger.info(f"Unstaking service: {chain_data.token}") @@ -1685,8 +1645,6 @@ def unstake_service_on_chain_from_safe( force=force, ) ).settle() - chain_data.staked = False - service.store() def claim_on_chain_from_safe( self, diff --git a/operate/services/service.py b/operate/services/service.py index 4fbc795db..2bc0b2252 100644 --- a/operate/services/service.py +++ b/operate/services/service.py @@ -81,7 +81,6 @@ LedgerConfig, LedgerConfigs, OnChainData, - OnChainState, OnChainUserParams, ServiceEnvProvisionType, ServiceTemplate, @@ -830,10 +829,6 @@ def migrate_format(cls, path: Path) -> bool: # pylint: disable=too-many-stateme ), "token": data.get("chain_data", {}).get("token"), "multisig": data.get("chain_data", {}).get("multisig"), - "staked": data.get("chain_data", {}).get("staked", False), - "on_chain_state": data.get("chain_data", {}).get( - "on_chain_state", 3 - ), "user_params": { "staking_program_id": "pearl_alpha", "nft": data.get("chain_data", {}) @@ -1037,8 +1032,6 @@ def new( # pylint: disable=too-many-locals instances=[], token=NON_EXISTENT_TOKEN, multisig=NON_EXISTENT_MULTISIG, - staked=False, - on_chain_state=OnChainState.NON_EXISTENT, user_params=OnChainUserParams.from_json(config), # type: ignore ) @@ -1223,8 +1216,6 @@ def update( instances=[], token=NON_EXISTENT_TOKEN, multisig=NON_EXISTENT_MULTISIG, - staked=False, - on_chain_state=OnChainState.NON_EXISTENT, user_params=OnChainUserParams.from_json(new_config), # type: ignore ) diff --git a/tests/test_services_service.py b/tests/test_services_service.py index 0b77d08ce..21fecf293 100644 --- a/tests/test_services_service.py +++ b/tests/test_services_service.py @@ -41,8 +41,6 @@ "service_config_id": "sc-00000000-0000-0000-0000-000000000000", "hash_timestamp": 1704063600, "token": 42, - "staked": True, - "on_chain_state": 4, "staking_program_id": "staking_program_1", "threshold": 1, "agent_id": 25, @@ -78,8 +76,6 @@ def get_config_json_data_v0(**kwargs: t.Any) -> t.Dict[str, t.Any]: "instances": [kwargs.get("instance_0")], "token": kwargs.get("token"), "multisig": kwargs.get("multisig"), - "staked": True, - "on_chain_state": kwargs.get("on_chain_state"), "user_params": { "nft": kwargs.get("nft"), "agent_id": kwargs.get("agent_id"), @@ -120,8 +116,6 @@ def get_config_json_data_v2(**kwargs: t.Any) -> t.Dict[str, t.Any]: "instances": [kwargs.get("instance_0")], "token": kwargs.get("token"), "multisig": kwargs.get("multisig"), - "staked": True, - "on_chain_state": kwargs.get("on_chain_state"), "user_params": { "staking_program_id": kwargs.get("staking_program_id"), "nft": kwargs.get("nft"), @@ -162,8 +156,6 @@ def get_config_json_data_v3(**kwargs: t.Any) -> t.Dict[str, t.Any]: "instances": [kwargs.get("instance_0")], "token": kwargs.get("token"), "multisig": kwargs.get("multisig"), - "staked": True, - "on_chain_state": kwargs.get("on_chain_state"), "user_params": { "staking_program_id": kwargs.get("staking_program_id"), "nft": kwargs.get("nft"), @@ -207,8 +199,6 @@ def get_config_json_data_v4(**kwargs: t.Any) -> t.Dict[str, t.Any]: "instances": [kwargs.get("instance_0")], "token": kwargs.get("token"), "multisig": kwargs.get("multisig"), - "staked": kwargs.get("staked"), - "on_chain_state": kwargs.get("on_chain_state"), "user_params": { "staking_program_id": kwargs.get("staking_program_id"), "nft": kwargs.get("nft"), @@ -255,8 +245,6 @@ def get_config_json_data_v5(**kwargs: t.Any) -> t.Dict[str, t.Any]: "instances": [kwargs.get("instance_0")], "token": kwargs.get("token"), "multisig": kwargs.get("multisig"), - "staked": kwargs.get("staked"), - "on_chain_state": kwargs.get("on_chain_state"), "user_params": { "staking_program_id": kwargs.get("staking_program_id"), "nft": kwargs.get("nft"), @@ -305,8 +293,6 @@ def get_config_json_data_v6(**kwargs: t.Any) -> t.Dict[str, t.Any]: "instances": [kwargs.get("instance_0")], "token": kwargs.get("token"), "multisig": kwargs.get("multisig"), - "staked": kwargs.get("staked"), - "on_chain_state": kwargs.get("on_chain_state"), "user_params": { "staking_program_id": kwargs.get("staking_program_id"), "nft": kwargs.get("nft"), From a9917dc6a54f0d6fadc3df9c4412b3bfd727bb88 Mon Sep 17 00:00:00 2001 From: Ojuswi Rastogi Date: Mon, 2 Jun 2025 16:49:08 +0530 Subject: [PATCH 2/3] Refactor: Remove duplicate import of `OnChainState` Signed-off-by: Ojuswi Rastogi --- operate/services/manage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/operate/services/manage.py b/operate/services/manage.py index 10ddca835..fae2546e5 100644 --- a/operate/services/manage.py +++ b/operate/services/manage.py @@ -62,6 +62,7 @@ Chain, FundingValues, LedgerConfig, + OnChainState, ServiceEnvProvisionType, ServiceTemplate, ) @@ -73,7 +74,6 @@ NON_EXISTENT_MULTISIG, NON_EXISTENT_TOKEN, OnChainData, - OnChainState, SERVICE_CONFIG_PREFIX, Service, ) From f5eebf42927c7a3d31baa396bcf01dd87c29911b Mon Sep 17 00:00:00 2001 From: Ojuswi Rastogi Date: Mon, 2 Jun 2025 18:40:41 +0530 Subject: [PATCH 3/3] keep migrating `staked` and `on_chain_state` fields Signed-off-by: Ojuswi Rastogi --- operate/services/service.py | 4 ++++ tests/test_services_service.py | 14 ++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/operate/services/service.py b/operate/services/service.py index 2bc0b2252..c45de10c4 100644 --- a/operate/services/service.py +++ b/operate/services/service.py @@ -829,6 +829,10 @@ def migrate_format(cls, path: Path) -> bool: # pylint: disable=too-many-stateme ), "token": data.get("chain_data", {}).get("token"), "multisig": data.get("chain_data", {}).get("multisig"), + "staked": data.get("chain_data", {}).get("staked", False), + "on_chain_state": data.get("chain_data", {}).get( + "on_chain_state", 3 + ), "user_params": { "staking_program_id": "pearl_alpha", "nft": data.get("chain_data", {}) diff --git a/tests/test_services_service.py b/tests/test_services_service.py index 21fecf293..0b77d08ce 100644 --- a/tests/test_services_service.py +++ b/tests/test_services_service.py @@ -41,6 +41,8 @@ "service_config_id": "sc-00000000-0000-0000-0000-000000000000", "hash_timestamp": 1704063600, "token": 42, + "staked": True, + "on_chain_state": 4, "staking_program_id": "staking_program_1", "threshold": 1, "agent_id": 25, @@ -76,6 +78,8 @@ def get_config_json_data_v0(**kwargs: t.Any) -> t.Dict[str, t.Any]: "instances": [kwargs.get("instance_0")], "token": kwargs.get("token"), "multisig": kwargs.get("multisig"), + "staked": True, + "on_chain_state": kwargs.get("on_chain_state"), "user_params": { "nft": kwargs.get("nft"), "agent_id": kwargs.get("agent_id"), @@ -116,6 +120,8 @@ def get_config_json_data_v2(**kwargs: t.Any) -> t.Dict[str, t.Any]: "instances": [kwargs.get("instance_0")], "token": kwargs.get("token"), "multisig": kwargs.get("multisig"), + "staked": True, + "on_chain_state": kwargs.get("on_chain_state"), "user_params": { "staking_program_id": kwargs.get("staking_program_id"), "nft": kwargs.get("nft"), @@ -156,6 +162,8 @@ def get_config_json_data_v3(**kwargs: t.Any) -> t.Dict[str, t.Any]: "instances": [kwargs.get("instance_0")], "token": kwargs.get("token"), "multisig": kwargs.get("multisig"), + "staked": True, + "on_chain_state": kwargs.get("on_chain_state"), "user_params": { "staking_program_id": kwargs.get("staking_program_id"), "nft": kwargs.get("nft"), @@ -199,6 +207,8 @@ def get_config_json_data_v4(**kwargs: t.Any) -> t.Dict[str, t.Any]: "instances": [kwargs.get("instance_0")], "token": kwargs.get("token"), "multisig": kwargs.get("multisig"), + "staked": kwargs.get("staked"), + "on_chain_state": kwargs.get("on_chain_state"), "user_params": { "staking_program_id": kwargs.get("staking_program_id"), "nft": kwargs.get("nft"), @@ -245,6 +255,8 @@ def get_config_json_data_v5(**kwargs: t.Any) -> t.Dict[str, t.Any]: "instances": [kwargs.get("instance_0")], "token": kwargs.get("token"), "multisig": kwargs.get("multisig"), + "staked": kwargs.get("staked"), + "on_chain_state": kwargs.get("on_chain_state"), "user_params": { "staking_program_id": kwargs.get("staking_program_id"), "nft": kwargs.get("nft"), @@ -293,6 +305,8 @@ def get_config_json_data_v6(**kwargs: t.Any) -> t.Dict[str, t.Any]: "instances": [kwargs.get("instance_0")], "token": kwargs.get("token"), "multisig": kwargs.get("multisig"), + "staked": kwargs.get("staked"), + "on_chain_state": kwargs.get("on_chain_state"), "user_params": { "staking_program_id": kwargs.get("staking_program_id"), "nft": kwargs.get("nft"),