diff --git a/report.py b/report.py index 7c6e4419..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 = "0x2Ef503950Be67a98746F484DA0bBAdA339DF3326" +SERVICE_STAKING_CONTRACT_ADDRESS = "0x43fB32f25dce34EB76c78C7A42C8F40F84BCD237" SERVICE_STAKING_TOKEN_JSON_PATH = Path( SCRIPT_PATH, "trader", diff --git a/run_service.sh b/run_service.sh index 4cd8ddaf..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="0x2Ef503950Be67a98746F484DA0bBAdA339DF3326" +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/scripts/staking.py b/scripts/staking.py index 1dd910bb..e86ab0d1 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: @@ -56,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, @@ -72,16 +75,34 @@ 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( + "\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}." ) 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,23 +114,32 @@ 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( +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( - 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 +147,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( @@ -127,6 +158,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( @@ -160,9 +192,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( @@ -202,21 +234,13 @@ def _try_stake_service( 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) - 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 +261,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 +321,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 ) @@ -318,6 +348,7 @@ def _try_stake_service( 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) @@ -354,6 +385,7 @@ def _try_stake_service( 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 @@ -364,3 +396,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..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="0x2Ef503950Be67a98746F484DA0bBAdA339DF3326" +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"