From 5a0aee3016998f3ad3e27eb249cdb7cf7741ea22 Mon Sep 17 00:00:00 2001 From: jmoreira-valory Date: Tue, 23 Apr 2024 14:02:21 +0200 Subject: [PATCH 1/6] feat: prepare for coastal --- report.py | 2 +- run_service.sh | 2 +- scripts/staking.py | 88 ++++++++++++++++++++++------------- terminate_on_chain_service.sh | 2 +- 4 files changed, 59 insertions(+), 35 deletions(-) diff --git a/report.py b/report.py index 7c6e4419..de2c8deb 100644 --- a/report.py +++ b/report.py @@ -51,7 +51,7 @@ OPERATOR_KEYS_JSON_PATH = Path(STORE_PATH, "operator_keys.json") SAFE_ADDRESS_PATH = Path(STORE_PATH, "service_safe_address.txt") SERVICE_ID_PATH = Path(STORE_PATH, "service_id.txt") -SERVICE_STAKING_CONTRACT_ADDRESS = "0x2Ef503950Be67a98746F484DA0bBAdA339DF3326" +SERVICE_STAKING_CONTRACT_ADDRESS = "0x97371B1C0cDA1D04dFc43DFb50a04645b7Bc9BEe" SERVICE_STAKING_TOKEN_JSON_PATH = Path( SCRIPT_PATH, "trader", diff --git a/run_service.sh b/run_service.sh index 4cd8ddaf..f2c6d759 100755 --- a/run_service.sh +++ b/run_service.sh @@ -596,7 +596,7 @@ export RPC_RETRIES=40 export RPC_TIMEOUT_SECONDS=120 export CUSTOM_SERVICE_MANAGER_ADDRESS="0x04b0007b2aFb398015B76e5f22993a1fddF83644" export CUSTOM_SERVICE_REGISTRY_ADDRESS="0x9338b5153AE39BB89f50468E608eD9d764B755fD" -export CUSTOM_STAKING_ADDRESS="0x2Ef503950Be67a98746F484DA0bBAdA339DF3326" +export CUSTOM_STAKING_ADDRESS="0x97371B1C0cDA1D04dFc43DFb50a04645b7Bc9BEe" export CUSTOM_OLAS_ADDRESS="0xcE11e14225575945b8E6Dc0D4F2dD4C570f79d9f" export CUSTOM_SERVICE_REGISTRY_TOKEN_UTILITY_ADDRESS="0xa45E64d13A30a51b91ae0eb182e88a40e9b18eD8" export CUSTOM_GNOSIS_SAFE_PROXY_FACTORY_ADDRESS="0x3C1fF68f5aa342D296d4DEe4Bb1cACCA912D95fE" diff --git a/scripts/staking.py b/scripts/staking.py index 1dd910bb..deea9893 100644 --- a/scripts/staking.py +++ b/scripts/staking.py @@ -45,7 +45,10 @@ ) -OLD_STAKING_PROGRAMS = {"Everest": "0x5add592ce0a1B5DceCebB5Dcac086Cd9F9e3eA5C"} +OLD_STAKING_PROGRAMS = { + "Everest": "0x5add592ce0a1B5DceCebB5Dcac086Cd9F9e3eA5C", + "Alpine": "0x2Ef503950Be67a98746F484DA0bBAdA339DF3326" +} def _format_duration(duration_seconds: int) -> str: @@ -72,16 +75,26 @@ def _unstake( return elif staking_program.startswith("Alpine"): if not is_service_staked( - ledger_api, args.service_id, args.staking_contract_address + ledger_api, service_id, staking_contract_address ): - print(f"Service {args.service_id} is not staked on {staking_program}..") + print(f"Service {service_id} is not staked on {staking_program}..") return + can_unstake = _check_unstaking_availability( + ledger_api, + service_id, + staking_contract_address, + staking_program, + ) + if not can_unstake: + print("Terminating script.") + sys.exit(1) + print( f"Service {service_id} is staked on {staking_program}. To continue in a new staking program, first, it must be unstaked from {staking_program}." ) user_input = input( - "Do you want to continue unstaking from {staking_program}? (yes/no)\n" + f"Do you want to continue unstaking service {service_id} from {staking_program}? (yes/no)\n" ).lower() print() @@ -93,7 +106,7 @@ def _unstake( unstake_txs = get_unstake_txs(ledger_api, service_id, staking_contract_address) for tx in unstake_txs: send_tx_and_wait_for_receipt(ledger_api, owner_crypto, tx) - print(f"Successfully unstaked service {args.service_id} from {staking_program}.") + print(f"Successfully unstaked service {service_id} from {staking_program}.") def _unstake_old_programs( @@ -104,12 +117,20 @@ def _unstake_old_programs( def _check_unstaking_availability( - now: float, - ts_start: float, - minimum_staking_duration: int, - available_rewards: float, + ledger_api: EthereumApi, + service_id: int, + staking_contract_address: str, staking_program: str, -) -> None: +) -> bool: + + now = time.time() + ts_start = get_service_info( + ledger_api, service_id, staking_contract_address + )[3] + minimum_staking_duration = get_min_staking_duration( + ledger_api, staking_contract_address + ) + available_rewards = get_available_rewards(ledger_api, staking_contract_address) if (now - ts_start) < minimum_staking_duration and available_rewards > 0: print( f"WARNING: Your service has been staked on {staking_program} for {_format_duration(int(now - ts_start))}." @@ -117,8 +138,9 @@ def _check_unstaking_availability( print( f"You cannot unstake your service from {staking_program} until it has been staked for at least {_format_duration(minimum_staking_duration)}." ) - print("Terminating script.") - sys.exit(1) + return False + + return True def _try_stake_service( @@ -160,9 +182,9 @@ def _try_stake_service( sys.exit(1) -if __name__ == "__main__": +def main() -> None: try: - staking_program = "Alpine" + staking_program = "Coastal" print(f"Starting {Path(__file__).name} script ({staking_program})...\n") parser = argparse.ArgumentParser( @@ -206,17 +228,9 @@ def _try_stake_service( # Collect information next_ts = get_next_checkpoint_ts(ledger_api, args.staking_contract_address) - ts_start = get_service_info( - ledger_api, args.service_id, args.staking_contract_address - )[3] - liveness_period = get_liveness_period(ledger_api, args.staking_contract_address) last_ts = next_ts - liveness_period now = time.time() - - minimum_staking_duration = get_min_staking_duration( - ledger_api, args.staking_contract_address - ) available_rewards = get_available_rewards( ledger_api, args.staking_contract_address ) @@ -237,14 +251,17 @@ def _try_stake_service( ) input("Press Enter to continue...") - _check_unstaking_availability( - now, - ts_start, - minimum_staking_duration, - available_rewards, + can_unstake = _check_unstaking_availability( + ledger_api, + args.service_id, + args.staking_contract_address, staking_program, ) + if not can_unstake: + print("Terminating script.") + sys.exit(1) + if now < next_ts: formatted_last_ts = datetime.utcfromtimestamp(last_ts).strftime( "%Y-%m-%d %H:%M:%S UTC" @@ -294,14 +311,17 @@ def _try_stake_service( f"Service {args.service_id} has been evicted from the {staking_program} staking program due to inactivity. Unstaking..." ) - _check_unstaking_availability( - now, - ts_start, - minimum_staking_duration, - available_rewards, + can_unstake = _check_unstaking_availability( + ledger_api, + args.service_id, + args.staking_contract_address, staking_program, ) + if not can_unstake: + print("Terminating script.") + sys.exit(1) + unstake_txs = get_unstake_txs( ledger_api, args.service_id, args.staking_contract_address ) @@ -364,3 +384,7 @@ def _try_stake_service( "\nPlease confirm whether your service is participating in a staking program, and then retry running the script." ) sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/terminate_on_chain_service.sh b/terminate_on_chain_service.sh index d80749cf..69bcd8cb 100755 --- a/terminate_on_chain_service.sh +++ b/terminate_on_chain_service.sh @@ -121,7 +121,7 @@ export CUSTOM_CHAIN_RPC=$rpc export CUSTOM_CHAIN_ID=$gnosis_chain_id export CUSTOM_SERVICE_MANAGER_ADDRESS="0x04b0007b2aFb398015B76e5f22993a1fddF83644" export CUSTOM_SERVICE_REGISTRY_ADDRESS="0x9338b5153AE39BB89f50468E608eD9d764B755fD" -export CUSTOM_STAKING_ADDRESS="0x2Ef503950Be67a98746F484DA0bBAdA339DF3326" +export CUSTOM_STAKING_ADDRESS="0x97371B1C0cDA1D04dFc43DFb50a04645b7Bc9BEe" export CUSTOM_OLAS_ADDRESS="0xcE11e14225575945b8E6Dc0D4F2dD4C570f79d9f" export CUSTOM_SERVICE_REGISTRY_TOKEN_UTILITY_ADDRESS="0xa45E64d13A30a51b91ae0eb182e88a40e9b18eD8" export CUSTOM_GNOSIS_SAFE_PROXY_FACTORY_ADDRESS="0x3C1fF68f5aa342D296d4DEe4Bb1cACCA912D95fE" From 6e2c2f4b5e2328d4e9680018baacbce2ba89ad52 Mon Sep 17 00:00:00 2001 From: jmoreira-valory Date: Tue, 23 Apr 2024 14:05:02 +0200 Subject: [PATCH 2/6] chore: message --- scripts/staking.py | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/staking.py b/scripts/staking.py index deea9893..8678b5b1 100644 --- a/scripts/staking.py +++ b/scripts/staking.py @@ -112,6 +112,7 @@ def _unstake( def _unstake_old_programs( ledger_api: EthereumApi, service_id: int, owner_crypto: EthereumCrypto ) -> None: + print("Unstaking from old programs...") for program, address in OLD_STAKING_PROGRAMS.items(): _unstake(ledger_api, service_id, address, program, owner_crypto) From 41a2e211d64dd7e16c09b0ecd7df77dc1dcab4d9 Mon Sep 17 00:00:00 2001 From: jmoreira-valory Date: Tue, 23 Apr 2024 15:12:26 +0200 Subject: [PATCH 3/6] fix: missing variable --- scripts/staking.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/staking.py b/scripts/staking.py index 8678b5b1..bdfdc746 100644 --- a/scripts/staking.py +++ b/scripts/staking.py @@ -150,6 +150,7 @@ def _try_stake_service( owner_crypto: EthereumCrypto, service_registry_address: str, staking_contract_address: str, + staking_program: str, ) -> None: if get_available_staking_slots(ledger_api, staking_contract_address) > 0: print( @@ -339,6 +340,7 @@ def main() -> None: owner_crypto=owner_crypto, service_registry_address=args.service_registry_address, staking_contract_address=args.staking_contract_address, + staking_program=staking_program, ) sys.exit(0) @@ -375,6 +377,7 @@ def main() -> None: owner_crypto=owner_crypto, service_registry_address=args.service_registry_address, staking_contract_address=args.staking_contract_address, + staking_program=staking_program, ) except Exception as e: # pylint: disable=broad-except From 1f47ffa9a7b17994db8e7af9e3b226b71fcde489 Mon Sep 17 00:00:00 2001 From: jmoreira-valory Date: Tue, 23 Apr 2024 15:32:13 +0200 Subject: [PATCH 4/6] fix: allow continue --- scripts/staking.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/scripts/staking.py b/scripts/staking.py index bdfdc746..e86ab0d1 100644 --- a/scripts/staking.py +++ b/scripts/staking.py @@ -59,7 +59,7 @@ def _format_duration(duration_seconds: int) -> str: return formatted_duration -def _unstake( +def _unstake_old_program( ledger_api: EthereumApi, service_id: int, staking_contract_address: str, @@ -87,8 +87,16 @@ def _unstake( staking_program, ) if not can_unstake: - print("Terminating script.") - sys.exit(1) + print( + "\n" + "WARNING: Service cannot be unstaked yet\n" + "---------------------------------------\n" + f"Service {service_id} cannot be unstaked from {staking_program} at this time.\n" + f"You can still run your service, but it will stay staked in {staking_program}.\n" + "Please, try re-running this script again at a later time to try stake on a new program.\n" + ) + input("Press Enter to continue...") + sys.exit(0) print( f"Service {service_id} is staked on {staking_program}. To continue in a new staking program, first, it must be unstaked from {staking_program}." @@ -109,12 +117,12 @@ def _unstake( print(f"Successfully unstaked service {service_id} from {staking_program}.") -def _unstake_old_programs( +def _unstake_all_old_programs( ledger_api: EthereumApi, service_id: int, owner_crypto: EthereumCrypto ) -> None: print("Unstaking from old programs...") for program, address in OLD_STAKING_PROGRAMS.items(): - _unstake(ledger_api, service_id, address, program, owner_crypto) + _unstake_old_program(ledger_api, service_id, address, program, owner_crypto) def _check_unstaking_availability( @@ -226,7 +234,7 @@ def main() -> None: private_key_path=args.owner_private_key_path, password=args.password ) - _unstake_old_programs(ledger_api, args.service_id, owner_crypto) + _unstake_all_old_programs(ledger_api, args.service_id, owner_crypto) # Collect information next_ts = get_next_checkpoint_ts(ledger_api, args.staking_contract_address) From 45a5382ba842f1b76b197c1a7b5baff0ef8ac257 Mon Sep 17 00:00:00 2001 From: jmoreira-valory <96571377+jmoreira-valory@users.noreply.github.com> Date: Tue, 23 Apr 2024 16:35:15 +0200 Subject: [PATCH 5/6] Update report.py Co-authored-by: David Galindo <35235550+dagacha@users.noreply.github.com> --- report.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/report.py b/report.py index de2c8deb..0312038d 100644 --- a/report.py +++ b/report.py @@ -51,7 +51,7 @@ OPERATOR_KEYS_JSON_PATH = Path(STORE_PATH, "operator_keys.json") SAFE_ADDRESS_PATH = Path(STORE_PATH, "service_safe_address.txt") SERVICE_ID_PATH = Path(STORE_PATH, "service_id.txt") -SERVICE_STAKING_CONTRACT_ADDRESS = "0x97371B1C0cDA1D04dFc43DFb50a04645b7Bc9BEe" +SERVICE_STAKING_CONTRACT_ADDRESS = "0x43fB32f25dce34EB76c78C7A42C8F40F84BCD237" SERVICE_STAKING_TOKEN_JSON_PATH = Path( SCRIPT_PATH, "trader", From fc6113d29d7504e8d95435382b53fa8e78e74fe3 Mon Sep 17 00:00:00 2001 From: jmoreira-valory Date: Tue, 23 Apr 2024 16:36:17 +0200 Subject: [PATCH 6/6] chore: update contract --- run_service.sh | 2 +- terminate_on_chain_service.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/run_service.sh b/run_service.sh index f2c6d759..b2906fe5 100755 --- a/run_service.sh +++ b/run_service.sh @@ -596,7 +596,7 @@ export RPC_RETRIES=40 export RPC_TIMEOUT_SECONDS=120 export CUSTOM_SERVICE_MANAGER_ADDRESS="0x04b0007b2aFb398015B76e5f22993a1fddF83644" export CUSTOM_SERVICE_REGISTRY_ADDRESS="0x9338b5153AE39BB89f50468E608eD9d764B755fD" -export CUSTOM_STAKING_ADDRESS="0x97371B1C0cDA1D04dFc43DFb50a04645b7Bc9BEe" +export CUSTOM_STAKING_ADDRESS="0x43fB32f25dce34EB76c78C7A42C8F40F84BCD237" export CUSTOM_OLAS_ADDRESS="0xcE11e14225575945b8E6Dc0D4F2dD4C570f79d9f" export CUSTOM_SERVICE_REGISTRY_TOKEN_UTILITY_ADDRESS="0xa45E64d13A30a51b91ae0eb182e88a40e9b18eD8" export CUSTOM_GNOSIS_SAFE_PROXY_FACTORY_ADDRESS="0x3C1fF68f5aa342D296d4DEe4Bb1cACCA912D95fE" diff --git a/terminate_on_chain_service.sh b/terminate_on_chain_service.sh index 69bcd8cb..d245b832 100755 --- a/terminate_on_chain_service.sh +++ b/terminate_on_chain_service.sh @@ -121,7 +121,7 @@ export CUSTOM_CHAIN_RPC=$rpc export CUSTOM_CHAIN_ID=$gnosis_chain_id export CUSTOM_SERVICE_MANAGER_ADDRESS="0x04b0007b2aFb398015B76e5f22993a1fddF83644" export CUSTOM_SERVICE_REGISTRY_ADDRESS="0x9338b5153AE39BB89f50468E608eD9d764B755fD" -export CUSTOM_STAKING_ADDRESS="0x97371B1C0cDA1D04dFc43DFb50a04645b7Bc9BEe" +export CUSTOM_STAKING_ADDRESS="0x43fB32f25dce34EB76c78C7A42C8F40F84BCD237" export CUSTOM_OLAS_ADDRESS="0xcE11e14225575945b8E6Dc0D4F2dD4C570f79d9f" export CUSTOM_SERVICE_REGISTRY_TOKEN_UTILITY_ADDRESS="0xa45E64d13A30a51b91ae0eb182e88a40e9b18eD8" export CUSTOM_GNOSIS_SAFE_PROXY_FACTORY_ADDRESS="0x3C1fF68f5aa342D296d4DEe4Bb1cACCA912D95fE"