From 8651630701f7959645b0d514de738194cb941172 Mon Sep 17 00:00:00 2001 From: jmoreira-valory Date: Fri, 19 Apr 2024 20:09:24 +0200 Subject: [PATCH 01/10] chore: change irrelevant tools --- run_service.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/run_service.sh b/run_service.sh index fb45a323..0baf1605 100755 --- a/run_service.sh +++ b/run_service.sh @@ -1063,7 +1063,7 @@ export OMEN_CREATORS='["0x89c5cc945dd550BcFfb72Fe42BfF002429F46Fec"]' export BET_THRESHOLD=100000000000000000 export TRADING_STRATEGY=kelly_criterion export PROMPT_TEMPLATE="Please take over the role of a Data Scientist to evaluate the given question. With the given question \"@{question}\" and the \`yes\` option represented by \`@{yes}\` and the \`no\` option represented by \`@{no}\`, what are the respective probabilities of \`p_yes\` and \`p_no\` occurring?" -export IRRELEVANT_TOOLS='["prediction-offline-sme", "openai-gpt-3.5-turbo-instruct", "prediction-online-summarized-info", "prediction-online-sum-url-content", "prediction-online", "openai-text-davinci-002", "openai-text-davinci-003", "openai-gpt-3.5-turbo", "openai-gpt-4", "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", "deepmind-optimization-strong", "deepmind-optimization", "claude-prediction-offline"]' +export IRRELEVANT_TOOLS='["claude-prediction-offline", "claude-prediction-online", "deepmind-optimization", "deepmind-optimization-strong", "openai-gpt-3.5-turbo", "openai-gpt-3.5-turbo-instruct", "openai-gpt-4", "openai-text-davinci-002", "openai-text-davinci-003", "prediction-online-sme", "prediction-online-sum-url-content", "prediction-online-summarized-info", "prediction-request-rag", "prediction-request-rag-claude", "prediction-request-reasoning-claude", "prediction-url-cot-claude", "stabilityai-stable-diffusion-512-v2-1", "stabilityai-stable-diffusion-768-v2-1", "stabilityai-stable-diffusion-v1-5", "stabilityai-stable-diffusion-xl-beta-v2-2-2"]' service_dir="trader_service" build_dir="abci_build" From 2e1d0b732b2118e9944b5dd17825f904a9722cff Mon Sep 17 00:00:00 2001 From: jmoreira-valory Date: Mon, 22 Apr 2024 16:51:47 +0200 Subject: [PATCH 02/10] chore: fix mech chain id --- run_service.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/run_service.sh b/run_service.sh index 0baf1605..10a970e7 100755 --- a/run_service.sh +++ b/run_service.sh @@ -608,6 +608,7 @@ export MECH_WRAPPED_NATIVE_TOKEN_ADDRESS=$WXDAI_ADDRESS export DISABLE_TRADING=false export STOP_TRADING_IF_STAKING_KPI_MET=true export RESET_PAUSE_DURATION=300 +export MECH_CHAIN_ID=ethereum # check if USE_NEVERMINED is set to true if [ "$USE_NEVERMINED" == "true" ]; From e79573ec62f9ced480a7e02b51faa23cb9d1a271 Mon Sep 17 00:00:00 2001 From: jmoreira-valory <96571377+jmoreira-valory@users.noreply.github.com> Date: Mon, 22 Apr 2024 19:59:15 +0200 Subject: [PATCH 03/10] Update run_service.sh --- run_service.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/run_service.sh b/run_service.sh index 10a970e7..0baf1605 100755 --- a/run_service.sh +++ b/run_service.sh @@ -608,7 +608,6 @@ export MECH_WRAPPED_NATIVE_TOKEN_ADDRESS=$WXDAI_ADDRESS export DISABLE_TRADING=false export STOP_TRADING_IF_STAKING_KPI_MET=true export RESET_PAUSE_DURATION=300 -export MECH_CHAIN_ID=ethereum # check if USE_NEVERMINED is set to true if [ "$USE_NEVERMINED" == "true" ]; From 4c61f570c7dd30da5b9bb42e669f3c01ac372767 Mon Sep 17 00:00:00 2001 From: jmoreira-valory <96571377+jmoreira-valory@users.noreply.github.com> Date: Tue, 23 Apr 2024 12:35:17 +0200 Subject: [PATCH 04/10] Update run_service.sh Co-authored-by: David Galindo <35235550+dagacha@users.noreply.github.com> --- run_service.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/run_service.sh b/run_service.sh index 0baf1605..cb553d2f 100755 --- a/run_service.sh +++ b/run_service.sh @@ -1063,7 +1063,7 @@ export OMEN_CREATORS='["0x89c5cc945dd550BcFfb72Fe42BfF002429F46Fec"]' export BET_THRESHOLD=100000000000000000 export TRADING_STRATEGY=kelly_criterion export PROMPT_TEMPLATE="Please take over the role of a Data Scientist to evaluate the given question. With the given question \"@{question}\" and the \`yes\` option represented by \`@{yes}\` and the \`no\` option represented by \`@{no}\`, what are the respective probabilities of \`p_yes\` and \`p_no\` occurring?" -export IRRELEVANT_TOOLS='["claude-prediction-offline", "claude-prediction-online", "deepmind-optimization", "deepmind-optimization-strong", "openai-gpt-3.5-turbo", "openai-gpt-3.5-turbo-instruct", "openai-gpt-4", "openai-text-davinci-002", "openai-text-davinci-003", "prediction-online-sme", "prediction-online-sum-url-content", "prediction-online-summarized-info", "prediction-request-rag", "prediction-request-rag-claude", "prediction-request-reasoning-claude", "prediction-url-cot-claude", "stabilityai-stable-diffusion-512-v2-1", "stabilityai-stable-diffusion-768-v2-1", "stabilityai-stable-diffusion-v1-5", "stabilityai-stable-diffusion-xl-beta-v2-2-2"]' +export IRRELEVANT_TOOLS='["claude-prediction-online","prediction-request-reasoning","prediction-online","prediction-offline","prediction-offline-sme","deepmind-optimization", "deepmind-optimization-strong", "openai-gpt-3.5-turbo", "openai-gpt-3.5-turbo-instruct", "openai-gpt-4", "openai-text-davinci-002", "openai-text-davinci-003", "prediction-online-sum-url-content", "prediction-online-summarized-info", "stabilityai-stable-diffusion-512-v2-1", "stabilityai-stable-diffusion-768-v2-1", "stabilityai-stable-diffusion-v1-5", "stabilityai-stable-diffusion-xl-beta-v2-2-2"]' service_dir="trader_service" build_dir="abci_build" From 5a0aee3016998f3ad3e27eb249cdb7cf7741ea22 Mon Sep 17 00:00:00 2001 From: jmoreira-valory Date: Tue, 23 Apr 2024 14:02:21 +0200 Subject: [PATCH 05/10] 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 06/10] 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 07/10] 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 08/10] 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 09/10] 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 10/10] 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"