diff --git a/docs/index.md b/docs/index.md index 4f5b0be5..262c86c8 100644 --- a/docs/index.md +++ b/docs/index.md @@ -31,7 +31,7 @@ In order to run a local demo service based on the IEKit: 2. Fetch the IEKit. ```bash - autonomy fetch valory/impact_evaluator:0.1.0:bafybeifzeyvfcio7k6izng3y2tn434h26tz2cl27uqwnkgzqk3r23lcngm --service + autonomy fetch valory/impact_evaluator:0.1.0:bafybeiagstbaqjtne235ejgne2s7qat2j24ue4ezdhbhmlipgev3e7dqe4 --service ``` 3. Build the Docker image of the service agents diff --git a/packages/packages.json b/packages/packages.json index ea64b4df..0b40fd10 100644 --- a/packages/packages.json +++ b/packages/packages.json @@ -15,24 +15,24 @@ "connection/valory/twitter/0.1.0": "bafybeiankzrpgovfe34wbxxwzmrg6lbdpe2uegcu4ujtswuopr3b7fsqdq", "connection/valory/openai/0.1.0": "bafybeibsevvadjkf4fdfbw23ett6e5l4whsxbiwzezdgbmlsin2jidbhcu", "connection/valory/farcaster/0.1.0": "bafybeibbdas7lxbipksodaphjms3uop7vnzjqkroktjq2g6wbvgtlldaxi", - "skill/valory/dynamic_nft_abci/0.1.0": "bafybeiee4rxt3kcdy4xo36micyrlxgil5dufmcnjrnlmcjvoibwjhqh73a", - "skill/valory/twitter_scoring_abci/0.1.0": "bafybeidmuebntwyf653f3k6nfrrtaeh3rlnyulp7gutgs4mmbo5qadr26e", + "skill/valory/dynamic_nft_abci/0.1.0": "bafybeichdqvj7jowsmmkwsh24w2lf4pntgjfcfaconeouwumyjjqh3xhh4", + "skill/valory/twitter_scoring_abci/0.1.0": "bafybeidwoqhgrppbmi25vxgy54gd2ord4ojmcr6b4k7dh4gqju3zy4oeuq", "skill/valory/ceramic_read_abci/0.1.0": "bafybeibph35jhtvn6kgytj6mqdz4lpjkvtfqd75qorrt4onv6i2trxfttu", "skill/valory/ceramic_write_abci/0.1.0": "bafybeihez2zrvvt6cyi5vu3fpomjlbo3v4fzyf4buv7ysxzj4dntr2wy3q", - "skill/valory/impact_evaluator_abci/0.1.0": "bafybeibfzbas5e4n253stcei5b5esizm3pw77vtsfvxr55nygz3z2w52dy", - "skill/valory/generic_scoring_abci/0.1.0": "bafybeie7v55simzep52usq6xe7x3basl7gpgkj6s6ye5fjxxwncov2g4pi", + "skill/valory/impact_evaluator_abci/0.1.0": "bafybeibfegizhdnpptdypjevzyqm7zd525rwmalpanu7dfnj4zueapgeti", + "skill/valory/generic_scoring_abci/0.1.0": "bafybeiej5iwzfvoan4kp4erfxva3h5vrrmon6ahbyupa2jdfypy5i25t5y", "skill/valory/twitter_write_abci/0.1.0": "bafybeig4dc4cereyshk535pfpparvxiuaimdu4lsm3hnl5li7pxafho6lu", "skill/valory/llm_abci/0.1.0": "bafybeife2ymfi54jtoarjrwm3nszc4scnxfrkmfeo33rjvufyr66auicse", - "skill/valory/decision_making_abci/0.1.0": "bafybeibvhg6nzs7os3c4enox6cc6ey42kkh62jrv5jpb5kpcjmykeblwmi", - "skill/valory/olas_week_abci/0.1.0": "bafybeiecbiznyj7ameijrpajwxcfmwt45edzjkfkrfnnhcwfb4fkdxbsuy", + "skill/valory/decision_making_abci/0.1.0": "bafybeie52kvwrsh4dyt45amlffclkdttclig33dyc4crb425zf2bcot36u", + "skill/valory/olas_week_abci/0.1.0": "bafybeibxaejlnyo5ngrw3mrcr74ca762w7hupfn4ow44fmmvuxefrv664m", "skill/valory/mech_interact_abci/0.1.0": "bafybeib4vn6m2yumwoclh5aatcdt5yxcjc5owxmxy5o7t3nfzormgwkr64", "skill/valory/farcaster_write_abci/0.1.0": "bafybeibbbfui3g2s63cg5vsvxqpzzdg2uxhd7a4ikwfo6dy7b2klqthvu4", "skill/valory/farcaster_test_abci/0.1.0": "bafybeiblauv376hvy7dzi232fxf6iq5nxxnhvk2gy6g7kcsj7a4r2bilqa", - "skill/valory/staking_abci/0.1.0": "bafybeiapp5q6x4mzmqa5l6t6nvnvo6ktoglnhaorncpipv3uxl5reqlwkm", - "agent/valory/impact_evaluator/0.1.0": "bafybeidwu3eh3lyvrisdiq4xcp43xh4pcqo4kbvbyyj3hpdkdfwcm4muw4", + "skill/valory/staking_abci/0.1.0": "bafybeie3wypei4kt35trwpa26ocn3zvxb6a45ch2wzbsaev3fxg6lj7yqm", + "agent/valory/impact_evaluator/0.1.0": "bafybeibwdz36lvhxir7q46l3canspsm56q6dzlfa67ubtw3ddfxxobh3ly", "agent/valory/farcaster_test/0.1.0": "bafybeig6yilme5s7fvru2b44dtr5xxqz3gf7p56swr7c5hip775l5wally", - "service/valory/impact_evaluator/0.1.0": "bafybeifzeyvfcio7k6izng3y2tn434h26tz2cl27uqwnkgzqk3r23lcngm", - "service/valory/impact_evaluator_local/0.1.0": "bafybeihluhnfjfpov3pzvywiag4c5w5xxcjdpbyrvfegviqzlfwl57eioq" + "service/valory/impact_evaluator/0.1.0": "bafybeiagstbaqjtne235ejgne2s7qat2j24ue4ezdhbhmlipgev3e7dqe4", + "service/valory/impact_evaluator_local/0.1.0": "bafybeihvww5todlcdomnkuqj5rjavakttq4mevfs4mvmwekinscgi666bi" }, "third_party": { "protocol/open_aea/signing/1.0.0": "bafybeihv62fim3wl2bayavfcg3u5e5cxu3b7brtu4cn5xoxd6lqwachasi", diff --git a/packages/valory/agents/impact_evaluator/aea-config.yaml b/packages/valory/agents/impact_evaluator/aea-config.yaml index f9383c23..d703497f 100644 --- a/packages/valory/agents/impact_evaluator/aea-config.yaml +++ b/packages/valory/agents/impact_evaluator/aea-config.yaml @@ -46,22 +46,22 @@ protocols: skills: - valory/abstract_abci:0.1.0:bafybeif2naoydlrqkdpnig34uejedwgurjwyvmbpcz53tif7pyukfdophq - valory/abstract_round_abci:0.1.0:bafybeigjddhk7epta7xpnfvv426xedff5abh4xlkwi6cqgp4vkutgkvydm -- valory/impact_evaluator_abci:0.1.0:bafybeibfzbas5e4n253stcei5b5esizm3pw77vtsfvxr55nygz3z2w52dy -- valory/generic_scoring_abci:0.1.0:bafybeie7v55simzep52usq6xe7x3basl7gpgkj6s6ye5fjxxwncov2g4pi -- valory/twitter_scoring_abci:0.1.0:bafybeidmuebntwyf653f3k6nfrrtaeh3rlnyulp7gutgs4mmbo5qadr26e +- valory/impact_evaluator_abci:0.1.0:bafybeibfegizhdnpptdypjevzyqm7zd525rwmalpanu7dfnj4zueapgeti +- valory/generic_scoring_abci:0.1.0:bafybeiej5iwzfvoan4kp4erfxva3h5vrrmon6ahbyupa2jdfypy5i25t5y +- valory/twitter_scoring_abci:0.1.0:bafybeidwoqhgrppbmi25vxgy54gd2ord4ojmcr6b4k7dh4gqju3zy4oeuq - valory/ceramic_read_abci:0.1.0:bafybeibph35jhtvn6kgytj6mqdz4lpjkvtfqd75qorrt4onv6i2trxfttu - valory/ceramic_write_abci:0.1.0:bafybeihez2zrvvt6cyi5vu3fpomjlbo3v4fzyf4buv7ysxzj4dntr2wy3q -- valory/dynamic_nft_abci:0.1.0:bafybeiee4rxt3kcdy4xo36micyrlxgil5dufmcnjrnlmcjvoibwjhqh73a +- valory/dynamic_nft_abci:0.1.0:bafybeichdqvj7jowsmmkwsh24w2lf4pntgjfcfaconeouwumyjjqh3xhh4 - valory/registration_abci:0.1.0:bafybeiagi6e2h7kochmlemy5c5yk6hwn37tfxiqvk2en74jhowsdwlmrny - valory/reset_pause_abci:0.1.0:bafybeiezfedmmseox3ce5aucxsiszdmvskrwwbtpb2a3vw3sbmc5jt7nri - valory/termination_abci:0.1.0:bafybeiea67epwwgngp7b3wavs6hpkaxv6etyaps6g6325bchfnf354mibq - valory/transaction_settlement_abci:0.1.0:bafybeifmgmwdkx4esemxjacjwzqkqymkuklb5nehkwqkx7v335fllgswcq - valory/twitter_write_abci:0.1.0:bafybeig4dc4cereyshk535pfpparvxiuaimdu4lsm3hnl5li7pxafho6lu -- valory/decision_making_abci:0.1.0:bafybeibvhg6nzs7os3c4enox6cc6ey42kkh62jrv5jpb5kpcjmykeblwmi +- valory/decision_making_abci:0.1.0:bafybeie52kvwrsh4dyt45amlffclkdttclig33dyc4crb425zf2bcot36u - valory/llm_abci:0.1.0:bafybeife2ymfi54jtoarjrwm3nszc4scnxfrkmfeo33rjvufyr66auicse -- valory/olas_week_abci:0.1.0:bafybeiecbiznyj7ameijrpajwxcfmwt45edzjkfkrfnnhcwfb4fkdxbsuy +- valory/olas_week_abci:0.1.0:bafybeibxaejlnyo5ngrw3mrcr74ca762w7hupfn4ow44fmmvuxefrv664m - valory/mech_interact_abci:0.1.0:bafybeib4vn6m2yumwoclh5aatcdt5yxcjc5owxmxy5o7t3nfzormgwkr64 -- valory/staking_abci:0.1.0:bafybeiapp5q6x4mzmqa5l6t6nvnvo6ktoglnhaorncpipv3uxl5reqlwkm +- valory/staking_abci:0.1.0:bafybeie3wypei4kt35trwpa26ocn3zvxb6a45ch2wzbsaev3fxg6lj7yqm default_ledger: ethereum required_ledgers: - ethereum diff --git a/packages/valory/services/impact_evaluator/service.yaml b/packages/valory/services/impact_evaluator/service.yaml index 8bffa224..f766d185 100644 --- a/packages/valory/services/impact_evaluator/service.yaml +++ b/packages/valory/services/impact_evaluator/service.yaml @@ -8,7 +8,7 @@ license: Apache-2.0 fingerprint: README.md: bafybeign56hilwuoa6bgos3uqabss4gew4vadkik7vhj3ucpqw6nxtqtpe fingerprint_ignore_patterns: [] -agent: valory/impact_evaluator:0.1.0:bafybeidwu3eh3lyvrisdiq4xcp43xh4pcqo4kbvbyyj3hpdkdfwcm4muw4 +agent: valory/impact_evaluator:0.1.0:bafybeibwdz36lvhxir7q46l3canspsm56q6dzlfa67ubtw3ddfxxobh3ly number_of_agents: 4 deployment: agent: diff --git a/packages/valory/services/impact_evaluator_local/service.yaml b/packages/valory/services/impact_evaluator_local/service.yaml index 8eb6589f..5e62d59d 100644 --- a/packages/valory/services/impact_evaluator_local/service.yaml +++ b/packages/valory/services/impact_evaluator_local/service.yaml @@ -8,7 +8,7 @@ license: Apache-2.0 fingerprint: README.md: bafybeign56hilwuoa6bgos3uqabss4gew4vadkik7vhj3ucpqw6nxtqtpe fingerprint_ignore_patterns: [] -agent: valory/impact_evaluator:0.1.0:bafybeidwu3eh3lyvrisdiq4xcp43xh4pcqo4kbvbyyj3hpdkdfwcm4muw4 +agent: valory/impact_evaluator:0.1.0:bafybeibwdz36lvhxir7q46l3canspsm56q6dzlfa67ubtw3ddfxxobh3ly number_of_agents: 1 deployment: agent: diff --git a/packages/valory/skills/decision_making_abci/behaviours.py b/packages/valory/skills/decision_making_abci/behaviours.py index 5013ccce..2ed9ada9 100644 --- a/packages/valory/skills/decision_making_abci/behaviours.py +++ b/packages/valory/skills/decision_making_abci/behaviours.py @@ -59,6 +59,7 @@ from packages.valory.skills.decision_making_abci.tasks.staking import ( StakingActivityPreparation, StakingCheckpointPreparation, + StakingDAAPreparation, ) from packages.valory.skills.decision_making_abci.tasks.tweet_validation_preparation import ( TweetValidationPreparation, @@ -134,6 +135,10 @@ }, Event.STAKING_CHECKPOINT.value: { "prev": StakingCheckpointPreparation, + "next": StakingDAAPreparation, + }, + Event.STAKING_DAA_UPDATE.value: { + "prev": StakingDAAPreparation, "next": UpdateCentaursPreparation, }, Event.UPDATE_CENTAURS.value: { @@ -344,6 +349,9 @@ def get_event(self) -> str: if tx_submitter == "checkpoint_preparation_behaviour": return Event.POST_TX_CHECKPOINT.value + if tx_submitter == "d_a_a_preparation_behaviour": + return Event.POST_TX_DAA.value + # This is a mech request return Event.POST_TX_MECH.value diff --git a/packages/valory/skills/decision_making_abci/fsm_specification.yaml b/packages/valory/skills/decision_making_abci/fsm_specification.yaml index 6864940c..d0098827 100644 --- a/packages/valory/skills/decision_making_abci/fsm_specification.yaml +++ b/packages/valory/skills/decision_making_abci/fsm_specification.yaml @@ -9,6 +9,7 @@ alphabet_in: - NO_MAJORITY - POST_TX_ACTIVITY_UPDATE - POST_TX_CHECKPOINT +- POST_TX_DAA - POST_TX_MECH - READ_CENTAURS - READ_CONTRIBUTE_DB @@ -18,6 +19,7 @@ alphabet_in: - SCORE - STAKING_ACTIVITY - STAKING_CHECKPOINT +- STAKING_DAA_UPDATE - TWEET_VALIDATION - UPDATE_CENTAURS - WEEK_IN_OLAS_CREATE @@ -26,6 +28,7 @@ default_start_state: DecisionMakingRound final_states: - FinishedDecisionMakingActivityRound - FinishedDecisionMakingCheckpointRound +- FinishedDecisionMakingDAARound - FinishedDecisionMakingDoneRound - FinishedDecisionMakingLLMRound - FinishedDecisionMakingReadCentaursRound @@ -39,6 +42,7 @@ final_states: - FinishedDecisionMakingWriteTwitterRound - FinishedPostActivityUpdateRound - FinishedPostCheckpointRound +- FinishedPostDAARound - FinishedPostMechResponseRound label: DecisionMakingAbciApp start_states: @@ -48,6 +52,7 @@ states: - DecisionMakingRound - FinishedDecisionMakingActivityRound - FinishedDecisionMakingCheckpointRound +- FinishedDecisionMakingDAARound - FinishedDecisionMakingDoneRound - FinishedDecisionMakingLLMRound - FinishedDecisionMakingReadCentaursRound @@ -61,6 +66,7 @@ states: - FinishedDecisionMakingWriteTwitterRound - FinishedPostActivityUpdateRound - FinishedPostCheckpointRound +- FinishedPostDAARound - FinishedPostMechResponseRound - PostTxDecisionMakingRound transition_func: @@ -80,6 +86,7 @@ transition_func: (DecisionMakingRound, SCORE): FinishedDecisionMakingScoreRound (DecisionMakingRound, STAKING_ACTIVITY): FinishedDecisionMakingActivityRound (DecisionMakingRound, STAKING_CHECKPOINT): FinishedDecisionMakingCheckpointRound + (DecisionMakingRound, STAKING_DAA_UPDATE): FinishedDecisionMakingDAARound (DecisionMakingRound, TWEET_VALIDATION): DecisionMakingRound (DecisionMakingRound, UPDATE_CENTAURS): FinishedDecisionMakingUpdateCentaurRound (DecisionMakingRound, WEEK_IN_OLAS_CREATE): FinishedDecisionMakingWeekInOlasRound @@ -88,4 +95,5 @@ transition_func: (PostTxDecisionMakingRound, NO_MAJORITY): PostTxDecisionMakingRound (PostTxDecisionMakingRound, POST_TX_ACTIVITY_UPDATE): FinishedPostActivityUpdateRound (PostTxDecisionMakingRound, POST_TX_CHECKPOINT): FinishedPostCheckpointRound + (PostTxDecisionMakingRound, POST_TX_DAA): FinishedPostDAARound (PostTxDecisionMakingRound, POST_TX_MECH): FinishedPostMechResponseRound diff --git a/packages/valory/skills/decision_making_abci/rounds.py b/packages/valory/skills/decision_making_abci/rounds.py index 81a1b7c1..ada9d42f 100644 --- a/packages/valory/skills/decision_making_abci/rounds.py +++ b/packages/valory/skills/decision_making_abci/rounds.py @@ -68,6 +68,8 @@ class Event(Enum): POST_TX_MECH = "post_tx_mech" POST_TX_ACTIVITY_UPDATE = "post_tx_activity_update" POST_TX_CHECKPOINT = "post_tx_checkpoint" + STAKING_DAA_UPDATE = "staking_daa_update" + POST_TX_DAA = "post_tx_daa" class SynchronizedData(BaseSynchronizedData): @@ -169,7 +171,7 @@ def end_block(self) -> Optional[Tuple[BaseSynchronizedData, Event]]: # Event.SCHEDULED_TWEET, Event.LLM, Event.DAILY_ORBIS, Event.DAILY_TWEET, Event.NEXT_CENTAUR # Event.SCORE, Event.READ_CONTRIBUTE_DB, Event.READ_MANUAL_POINTS, Event.WRITE_CONTRIBUTE_DB # Event.WEEK_IN_OLAS_CREATE, Event.TWEET_VALIDATION, Event.FORCE_DB_UPDATE, Event.CAMPAIGN_VALIDATION - # Event.STAKING_ACTIVITY, Event.STAKING_CHECKPOINT + # Event.STAKING_ACTIVITY, Event.STAKING_CHECKPOINT, Event.STAKING_DAA_UPDATE payload = json.loads(self.most_voted_payload) event = Event(payload["event"]) @@ -211,7 +213,7 @@ def end_block(self) -> Optional[Tuple[BaseSynchronizedData, Event]]: # We reference all the events here to prevent the check-abciapp-specs tool from complaining # since this round receives the event via payload # Event.DONE, Event.NO_MAJORITY - # Event.POST_TX_MECH, Event.POST_TX_ACTIVITY_UPDATE, Event.POST_TX_CHECKPOINT + # Event.POST_TX_MECH, Event.POST_TX_ACTIVITY_UPDATE, Event.POST_TX_CHECKPOINT, Event.POST_TX_DAA event = Event(self.most_voted_payload) return self.synchronized_data, event @@ -275,6 +277,10 @@ class FinishedDecisionMakingCheckpointRound(DegenerateRound): """FinishedDecisionMakingCheckpointRound""" +class FinishedDecisionMakingDAARound(DegenerateRound): + """FinishedDecisionMakingDAARound""" + + class FinishedPostMechResponseRound(DegenerateRound): """FinishedPostMechResponseRound""" @@ -287,6 +293,10 @@ class FinishedPostCheckpointRound(DegenerateRound): """FinishedPostCheckpointRound""" +class FinishedPostDAARound(DegenerateRound): + """FinishedPostDAARound""" + + class DecisionMakingAbciApp(AbciApp[Event]): """DecisionMakingAbciApp""" @@ -314,11 +324,13 @@ class DecisionMakingAbciApp(AbciApp[Event]): Event.CAMPAIGN_VALIDATION: DecisionMakingRound, Event.STAKING_ACTIVITY: FinishedDecisionMakingActivityRound, Event.STAKING_CHECKPOINT: FinishedDecisionMakingCheckpointRound, + Event.STAKING_DAA_UPDATE: FinishedDecisionMakingDAARound, }, PostTxDecisionMakingRound: { Event.POST_TX_MECH: FinishedPostMechResponseRound, Event.POST_TX_ACTIVITY_UPDATE: FinishedPostActivityUpdateRound, Event.POST_TX_CHECKPOINT: FinishedPostCheckpointRound, + Event.POST_TX_DAA: FinishedPostDAARound, Event.DONE: PostTxDecisionMakingRound, Event.NO_MAJORITY: PostTxDecisionMakingRound, }, @@ -338,6 +350,8 @@ class DecisionMakingAbciApp(AbciApp[Event]): FinishedPostMechResponseRound: {}, FinishedPostActivityUpdateRound: {}, FinishedPostCheckpointRound: {}, + FinishedPostDAARound: {}, + FinishedDecisionMakingDAARound: {}, } final_states: Set[AppState] = { FinishedDecisionMakingReadCentaursRound, @@ -356,6 +370,8 @@ class DecisionMakingAbciApp(AbciApp[Event]): FinishedPostMechResponseRound, FinishedPostActivityUpdateRound, FinishedPostCheckpointRound, + FinishedPostDAARound, + FinishedDecisionMakingDAARound, } event_to_timeout: EventToTimeout = { Event.ROUND_TIMEOUT: 30.0, @@ -382,4 +398,6 @@ class DecisionMakingAbciApp(AbciApp[Event]): FinishedPostMechResponseRound: set(), FinishedPostActivityUpdateRound: set(), FinishedPostCheckpointRound: set(), + FinishedPostDAARound: set(), + FinishedDecisionMakingDAARound: set(), } diff --git a/packages/valory/skills/decision_making_abci/skill.yaml b/packages/valory/skills/decision_making_abci/skill.yaml index 0118d9c9..6e21468c 100644 --- a/packages/valory/skills/decision_making_abci/skill.yaml +++ b/packages/valory/skills/decision_making_abci/skill.yaml @@ -7,20 +7,20 @@ license: Apache-2.0 aea_version: '>=1.0.0, <2.0.0' fingerprint: __init__.py: bafybeicq2o3mkcgbmi4hkmpr3c6fieemutea2gxthymxnbhpemrzlcp2la - behaviours.py: bafybeicrecygn3grh42mb6dvjxgul3zvhrqwea4xq5aulcppvycupgjyoe + behaviours.py: bafybeigwtxrg5yz3cth32azgngvofrsvduaownukivld44sea2eqvu5q2i dialogues.py: bafybeic5nwnax5tz6plxi5rww6davp23vgb6fixnlhzv2isoknuvb2bhye - fsm_specification.yaml: bafybeidw4kakgv56qrlowz4efgtkh6jzopcdnkktjwuyiruaapgxbgw4me + fsm_specification.yaml: bafybeihckbzmtewjwlbdvghzuadspopa25gsvtkgud5v6ymob6bnt4pium handlers.py: bafybeibo54pwzdc5o4zwsqqaveiebxsfqtk2px5nh662bb5mxydtc2oz5q models.py: bafybeiatvo5f3kt5euaeddnrhnkjoznarjnnscwn2vgr3hq3qdd5xtwcau payloads.py: bafybeic6jrms2xs2odykwwngr5yyqm6cus7cyihdbxux26glpq3573q3ay - rounds.py: bafybeigggtlatqsymrvlo522vvmbrq5nz3k7mtkxufj2ltrgbtuqhlyji4 + rounds.py: bafybeigzdnn6u6hxjxkdnn4ei77svbml6lwvowzyoh3ttagevpx5ursaba tasks/campaign_validation_preparation.py: bafybeiafgc7lzgtl6qwo3qsdpskipm4qeby6c5nmltm4x4yp3zcwn5a6z4 tasks/finished_pipeline_preparation.py: bafybeid652b53p7mtsbj3ksko3g2eezvg4nut2vukwvnfhxyfi4zkx3dym tasks/llm_preparation.py: bafybeigivqniwvqzmhpqytrn5gz3gb5caa6nlvctkbycbk4cmtut6hvuvi tasks/read_stream_preparation.py: bafybeicmjasiyecopfweobodzbmn3tbluu5q724uzzqkit6urn3lb5q354 tasks/score_preparations.py: bafybeie7cfot24zcyod5becz6t5lasvva77httfkw57qmvgjk35d3qluxa tasks/signature_validation.py: bafybeihbwrv72hnh3ytko2i5oszqgdky2j6h2wse45wvuhf2j32lo2tsjy - tasks/staking.py: bafybeihmzs7tv4hxie2lia2unbn3y5mbre4dyii2xvns6rzpvz6lpinjby + tasks/staking.py: bafybeihg54pf7ekzzped6tulzfv74vkeyfijlgzsgmlr7ndyq642qtixtu tasks/task_preparations.py: bafybeihfm3ms665fvz2qwmhmcwgl2ws5mt62pykomowoxpm6a46jlqvsmu tasks/tweet_validation_preparation.py: bafybeif3wbfskiyuij7unx72euklms7owrzwzgdu462xatvypalm6xrgca tasks/twitter_preparation.py: bafybeicn7stcvmd6oex55dwptwxpikpssbcwnj2d3xkercikg5nlzqh4k4 @@ -58,7 +58,7 @@ protocols: skills: - valory/abstract_round_abci:0.1.0:bafybeigjddhk7epta7xpnfvv426xedff5abh4xlkwi6cqgp4vkutgkvydm - valory/ceramic_read_abci:0.1.0:bafybeibph35jhtvn6kgytj6mqdz4lpjkvtfqd75qorrt4onv6i2trxfttu -- valory/staking_abci:0.1.0:bafybeiapp5q6x4mzmqa5l6t6nvnvo6ktoglnhaorncpipv3uxl5reqlwkm +- valory/staking_abci:0.1.0:bafybeie3wypei4kt35trwpa26ocn3zvxb6a45ch2wzbsaev3fxg6lj7yqm behaviours: main: args: {} diff --git a/packages/valory/skills/decision_making_abci/tasks/staking.py b/packages/valory/skills/decision_making_abci/tasks/staking.py index 87e67c11..d7987fa4 100644 --- a/packages/valory/skills/decision_making_abci/tasks/staking.py +++ b/packages/valory/skills/decision_making_abci/tasks/staking.py @@ -105,6 +105,8 @@ def get_epoch_end( ) -> Generator[None, None, Optional[datetime]]: """Get the epoch end""" + self.logger.info(f"Getting epoch end for {staking_contract_address}") + contract_api_msg = yield from self.behaviour.get_contract_api_response( performative=ContractApiMessage.Performative.GET_STATE, # type: ignore contract_address=staking_contract_address, @@ -120,6 +122,7 @@ def get_epoch_end( epoch_end_ts = contract_api_msg.state.body["epoch_end"] epoch_end = datetime.fromtimestamp(epoch_end_ts, tz=timezone.utc) + self.logger.info(f"Epoch end is {epoch_end}") return epoch_end def is_epoch_ending(self, staking_contract_address) -> Generator[None, None, bool]: @@ -332,13 +335,14 @@ def get_activity_updates( k: v["points"] for k, v in this_epoch_not_counted_tweets.items() } - ( - multisig_to_updates[service_multisig], - user_to_counted_tweets[user_id], - ) = group_tweets( + (updates, selected_tweets) = group_tweets( not_counted_tweet_id_to_points, points_pending_from_previous_run ) + if updates: + multisig_to_updates[service_multisig] = updates + user_to_counted_tweets[user_id] = selected_tweets + self.context.logger.info(f"Calculated activity updates: {multisig_to_updates}") self.context.logger.info( f"Tweets included in the potential update: {user_to_counted_tweets}" @@ -370,3 +374,35 @@ def check_extra_conditions(self): self.context.logger.info("Not time to call the checkpoint yet.") return False + + +class StakingDAAPreparation(TaskPreparation): + """StakingDAAPreparation""" + + task_name = "staking_daa" + task_event = Event.STAKING_DAA_UPDATE.value + + def _pre_task(self): + """Preparations before running the task""" + yield + updates = {} + return updates, self.task_event + + def _post_task(self): + """Preparations after running the task""" + centaurs_data = self.synchronized_data.centaurs_data + current_centaur = centaurs_data[self.synchronized_data.current_centaur_index] + + # Update the last run time + current_centaur["configuration"]["plugins"][self.task_name][ + "last_run" + ] = self.now_utc.strftime("%Y-%m-%d %H:%M:%S %Z") + + updates = {"centaurs_data": centaurs_data, "has_centaurs_changes": True} + yield + return updates, None + + def check_extra_conditions(self): + """Check user staking threshold""" + yield + return True diff --git a/packages/valory/skills/dynamic_nft_abci/skill.yaml b/packages/valory/skills/dynamic_nft_abci/skill.yaml index 5c3dbf37..eaab7b7a 100644 --- a/packages/valory/skills/dynamic_nft_abci/skill.yaml +++ b/packages/valory/skills/dynamic_nft_abci/skill.yaml @@ -31,7 +31,7 @@ protocols: - valory/http:1.0.0:bafybeifugzl63kfdmwrxwphrnrhj7bn6iruxieme3a4ntzejf6kmtuwmae skills: - valory/abstract_round_abci:0.1.0:bafybeigjddhk7epta7xpnfvv426xedff5abh4xlkwi6cqgp4vkutgkvydm -- valory/decision_making_abci:0.1.0:bafybeibvhg6nzs7os3c4enox6cc6ey42kkh62jrv5jpb5kpcjmykeblwmi +- valory/decision_making_abci:0.1.0:bafybeie52kvwrsh4dyt45amlffclkdttclig33dyc4crb425zf2bcot36u behaviours: main: args: {} diff --git a/packages/valory/skills/generic_scoring_abci/skill.yaml b/packages/valory/skills/generic_scoring_abci/skill.yaml index c72aaf2a..5edc8685 100644 --- a/packages/valory/skills/generic_scoring_abci/skill.yaml +++ b/packages/valory/skills/generic_scoring_abci/skill.yaml @@ -28,7 +28,7 @@ contracts: [] protocols: [] skills: - valory/abstract_round_abci:0.1.0:bafybeigjddhk7epta7xpnfvv426xedff5abh4xlkwi6cqgp4vkutgkvydm -- valory/decision_making_abci:0.1.0:bafybeibvhg6nzs7os3c4enox6cc6ey42kkh62jrv5jpb5kpcjmykeblwmi +- valory/decision_making_abci:0.1.0:bafybeie52kvwrsh4dyt45amlffclkdttclig33dyc4crb425zf2bcot36u behaviours: main: args: {} diff --git a/packages/valory/skills/impact_evaluator_abci/composition.py b/packages/valory/skills/impact_evaluator_abci/composition.py index 78d2f2b6..14de5427 100644 --- a/packages/valory/skills/impact_evaluator_abci/composition.py +++ b/packages/valory/skills/impact_evaluator_abci/composition.py @@ -72,10 +72,13 @@ DecisionMakingAbci.FinishedDecisionMakingCheckpointRound: StakingAbci.CheckpointPreparationRound, DecisionMakingAbci.FinishedPostMechResponseRound: MechResponseStates.MechResponseRound, DecisionMakingAbci.FinishedPostActivityUpdateRound: StakingAbci.ActivityScoreRound, + DecisionMakingAbci.FinishedDecisionMakingDAARound: StakingAbci.DAAPreparationRound, DecisionMakingAbci.FinishedPostCheckpointRound: DecisionMakingAbci.DecisionMakingRound, + DecisionMakingAbci.FinishedPostDAARound: DecisionMakingAbci.DecisionMakingRound, StakingAbci.FinishedActivityRound: DecisionMakingAbci.DecisionMakingRound, StakingAbci.FinishedActivityUpdatePreparationRound: TxSettlementAbci.RandomnessTransactionSubmissionRound, StakingAbci.FinishedCheckpointPreparationRound: TxSettlementAbci.RandomnessTransactionSubmissionRound, + StakingAbci.FinishedDAAPreparationRound: TxSettlementAbci.RandomnessTransactionSubmissionRound, MechFinalStates.FinishedMechResponseRound: TwitterScoringAbci.TwitterDecisionMakingRound, MechFinalStates.FinishedMechRequestSkipRound: TwitterScoringAbci.TwitterDecisionMakingRound, MechFinalStates.FinishedMechResponseTimeoutRound: MechResponseStates.MechResponseRound, diff --git a/packages/valory/skills/impact_evaluator_abci/fsm_specification.yaml b/packages/valory/skills/impact_evaluator_abci/fsm_specification.yaml index 24642f1a..98d93dff 100644 --- a/packages/valory/skills/impact_evaluator_abci/fsm_specification.yaml +++ b/packages/valory/skills/impact_evaluator_abci/fsm_specification.yaml @@ -33,6 +33,7 @@ alphabet_in: - POST_MECH - POST_TX_ACTIVITY_UPDATE - POST_TX_CHECKPOINT +- POST_TX_DAA - POST_TX_MECH - PRE_MECH - PROCESS_UPDATES @@ -53,6 +54,7 @@ alphabet_in: - SKIP_REQUEST - STAKING_ACTIVITY - STAKING_CHECKPOINT +- STAKING_DAA_UPDATE - SUSPICIOUS_ACTIVITY - TWEET_EVALUATION_ROUND_TIMEOUT - TWEET_VALIDATION @@ -74,6 +76,7 @@ states: - CheckTransactionHistoryRound - CheckpointPreparationRound - CollectSignatureRound +- DAAPreparationRound - DBUpdateRound - DecisionMakingRound - FinalizationRound @@ -142,6 +145,9 @@ transition_func: (CollectSignatureRound, DONE): FinalizationRound (CollectSignatureRound, NO_MAJORITY): ResetRound (CollectSignatureRound, ROUND_TIMEOUT): CollectSignatureRound + (DAAPreparationRound, DONE): RandomnessTransactionSubmissionRound + (DAAPreparationRound, NO_MAJORITY): DAAPreparationRound + (DAAPreparationRound, ROUND_TIMEOUT): DAAPreparationRound (DBUpdateRound, DONE): TwitterDecisionMakingRound (DBUpdateRound, NO_MAJORITY): DBUpdateRound (DBUpdateRound, ROUND_TIMEOUT): DBUpdateRound @@ -161,6 +167,7 @@ transition_func: (DecisionMakingRound, SCORE): GenericScoringRound (DecisionMakingRound, STAKING_ACTIVITY): ActivityScoreRound (DecisionMakingRound, STAKING_CHECKPOINT): CheckpointPreparationRound + (DecisionMakingRound, STAKING_DAA_UPDATE): DAAPreparationRound (DecisionMakingRound, TWEET_VALIDATION): DecisionMakingRound (DecisionMakingRound, UPDATE_CENTAURS): RandomnessRound (DecisionMakingRound, WEEK_IN_OLAS_CREATE): OlasWeekDecisionMakingRound @@ -224,6 +231,7 @@ transition_func: (PostTxDecisionMakingRound, NO_MAJORITY): PostTxDecisionMakingRound (PostTxDecisionMakingRound, POST_TX_ACTIVITY_UPDATE): ActivityScoreRound (PostTxDecisionMakingRound, POST_TX_CHECKPOINT): DecisionMakingRound + (PostTxDecisionMakingRound, POST_TX_DAA): DecisionMakingRound (PostTxDecisionMakingRound, POST_TX_MECH): MechResponseRound (PreMechRequestRound, DONE): MechRequestRound (PreMechRequestRound, NO_MAJORITY): PreMechRequestRound diff --git a/packages/valory/skills/impact_evaluator_abci/skill.yaml b/packages/valory/skills/impact_evaluator_abci/skill.yaml index ec3c7ecf..0525958c 100644 --- a/packages/valory/skills/impact_evaluator_abci/skill.yaml +++ b/packages/valory/skills/impact_evaluator_abci/skill.yaml @@ -8,9 +8,9 @@ aea_version: '>=1.0.0, <2.0.0' fingerprint: __init__.py: bafybeigmhxenrqb2ysjhcm2au2lang4abyny6irkzqqg4dtclz6net6zpy behaviours.py: bafybeiciogdifxopcplhlbnpuftwqh5zo4bubyimx7b4r5vfcdtpv5vhpq - composition.py: bafybeigij3bnfoeorq6znlgfjjosopvsbqjg2xbrotcud4pevoiopfghyq + composition.py: bafybeiaifbbtpqu5kk26tdibwky3j3alcrpb2zdeoptfy4rzamqtlrvnkq dialogues.py: bafybeigybns7lilv57day366bo6kri5ehu3nbrfjk6x7a7pz3xq4wc5r6e - fsm_specification.yaml: bafybeiadeoixeufihanybmpwuxbtqyrrzmqa3n4z7vrmowpj4hgfkscquu + fsm_specification.yaml: bafybeies2gqemrvigszvpg7l733gyyyck3ieeidc5jfdnwqwwvgyumhiha handlers.py: bafybeihnfjtuusm65o76lr4q6rdawq6xjc7d7hywmcdabop7vgvuxdry3e models.py: bafybeif7unc573kd5bpot3vjfmoktbkeervsms72cqobd52y74txcwq55y tests/__init__.py: bafybeievwzwojvq4aofk5kjpf4jzygfes7ew6s6svc6b6frktjnt3sicce @@ -25,20 +25,20 @@ protocols: [] skills: - valory/abstract_round_abci:0.1.0:bafybeigjddhk7epta7xpnfvv426xedff5abh4xlkwi6cqgp4vkutgkvydm - valory/ceramic_read_abci:0.1.0:bafybeibph35jhtvn6kgytj6mqdz4lpjkvtfqd75qorrt4onv6i2trxfttu -- valory/generic_scoring_abci:0.1.0:bafybeie7v55simzep52usq6xe7x3basl7gpgkj6s6ye5fjxxwncov2g4pi -- valory/twitter_scoring_abci:0.1.0:bafybeidmuebntwyf653f3k6nfrrtaeh3rlnyulp7gutgs4mmbo5qadr26e +- valory/generic_scoring_abci:0.1.0:bafybeiej5iwzfvoan4kp4erfxva3h5vrrmon6ahbyupa2jdfypy5i25t5y +- valory/twitter_scoring_abci:0.1.0:bafybeidwoqhgrppbmi25vxgy54gd2ord4ojmcr6b4k7dh4gqju3zy4oeuq - valory/ceramic_write_abci:0.1.0:bafybeihez2zrvvt6cyi5vu3fpomjlbo3v4fzyf4buv7ysxzj4dntr2wy3q -- valory/dynamic_nft_abci:0.1.0:bafybeiee4rxt3kcdy4xo36micyrlxgil5dufmcnjrnlmcjvoibwjhqh73a +- valory/dynamic_nft_abci:0.1.0:bafybeichdqvj7jowsmmkwsh24w2lf4pntgjfcfaconeouwumyjjqh3xhh4 - valory/registration_abci:0.1.0:bafybeiagi6e2h7kochmlemy5c5yk6hwn37tfxiqvk2en74jhowsdwlmrny - valory/reset_pause_abci:0.1.0:bafybeiezfedmmseox3ce5aucxsiszdmvskrwwbtpb2a3vw3sbmc5jt7nri - valory/termination_abci:0.1.0:bafybeiea67epwwgngp7b3wavs6hpkaxv6etyaps6g6325bchfnf354mibq - valory/transaction_settlement_abci:0.1.0:bafybeifmgmwdkx4esemxjacjwzqkqymkuklb5nehkwqkx7v335fllgswcq -- valory/decision_making_abci:0.1.0:bafybeibvhg6nzs7os3c4enox6cc6ey42kkh62jrv5jpb5kpcjmykeblwmi +- valory/decision_making_abci:0.1.0:bafybeie52kvwrsh4dyt45amlffclkdttclig33dyc4crb425zf2bcot36u - valory/llm_abci:0.1.0:bafybeife2ymfi54jtoarjrwm3nszc4scnxfrkmfeo33rjvufyr66auicse - valory/twitter_write_abci:0.1.0:bafybeig4dc4cereyshk535pfpparvxiuaimdu4lsm3hnl5li7pxafho6lu -- valory/olas_week_abci:0.1.0:bafybeiecbiznyj7ameijrpajwxcfmwt45edzjkfkrfnnhcwfb4fkdxbsuy +- valory/olas_week_abci:0.1.0:bafybeibxaejlnyo5ngrw3mrcr74ca762w7hupfn4ow44fmmvuxefrv664m - valory/mech_interact_abci:0.1.0:bafybeib4vn6m2yumwoclh5aatcdt5yxcjc5owxmxy5o7t3nfzormgwkr64 -- valory/staking_abci:0.1.0:bafybeiapp5q6x4mzmqa5l6t6nvnvo6ktoglnhaorncpipv3uxl5reqlwkm +- valory/staking_abci:0.1.0:bafybeie3wypei4kt35trwpa26ocn3zvxb6a45ch2wzbsaev3fxg6lj7yqm behaviours: main: args: {} diff --git a/packages/valory/skills/olas_week_abci/skill.yaml b/packages/valory/skills/olas_week_abci/skill.yaml index 8f084605..b597794c 100644 --- a/packages/valory/skills/olas_week_abci/skill.yaml +++ b/packages/valory/skills/olas_week_abci/skill.yaml @@ -31,7 +31,7 @@ protocols: - valory/llm:1.0.0:bafybeihj2orqapokafg7co3wlogwgf6cckaaj2bz3nuv4rm3opkoyhrlp4 skills: - valory/abstract_round_abci:0.1.0:bafybeigjddhk7epta7xpnfvv426xedff5abh4xlkwi6cqgp4vkutgkvydm -- valory/decision_making_abci:0.1.0:bafybeibvhg6nzs7os3c4enox6cc6ey42kkh62jrv5jpb5kpcjmykeblwmi +- valory/decision_making_abci:0.1.0:bafybeie52kvwrsh4dyt45amlffclkdttclig33dyc4crb425zf2bcot36u behaviours: main: args: {} diff --git a/packages/valory/skills/staking_abci/behaviours.py b/packages/valory/skills/staking_abci/behaviours.py index 090b1acd..f49418db 100644 --- a/packages/valory/skills/staking_abci/behaviours.py +++ b/packages/valory/skills/staking_abci/behaviours.py @@ -19,10 +19,9 @@ """This package contains round behaviours of StakingMakingAbciApp.""" -import json from abc import ABC from datetime import datetime, timezone -from typing import Dict, Generator, List, Optional, Set, Tuple, Type, cast +from typing import Generator, List, Optional, Set, Type, cast from packages.valory.contracts.gnosis_safe.contract import ( GnosisSafeContract, @@ -47,6 +46,8 @@ ActivityUpdatePreparationRound, CheckpointPreparationPayload, CheckpointPreparationRound, + DAAPreparationPayload, + DAAPreparationRound, StakingAbciApp, SynchronizedData, ) @@ -61,6 +62,7 @@ EMPTY_CALL_DATA = b"0x" SAFE_GAS = 0 BASE_CHAIN_ID = "base" +SECONDS_IN_DAY = 86400 class StakingBaseBehaviour(BaseBehaviour, ABC): @@ -434,6 +436,110 @@ def get_checkpoint_hash(self) -> Generator[None, None, Optional[str]]: return safe_tx_hash +class DAAPreparationBehaviour(StakingBaseBehaviour): + """DAAPreparationBehaviour""" + + matching_round: Type[AbstractRound] = DAAPreparationRound + + def async_act(self) -> Generator: + """Do the act, supporting asynchronous execution.""" + + with self.context.benchmark_tool.measure(self.behaviour_id).local(): + sender = self.context.agent_address + tx_hash = yield from self.get_daa_hash() + payload = DAAPreparationPayload( + sender=sender, + tx_submitter=self.auto_behaviour_id(), + tx_hash=tx_hash, + safe_contract_address=self.params.safe_contract_address_base + ) + + with self.context.benchmark_tool.measure(self.behaviour_id).consensus(): + yield from self.send_a2a_transaction(payload) + yield from self.wait_until_round_end() + + self.set_done() + + def get_daa_hash(self) -> Generator[None, None, Optional[str]]: + """Prepare the DAA update tx""" + self.context.logger.info( + "Preparing DAA update" + ) + now_utc = self._get_utc_time() + + active_multisigs: List[str] = [] + + # Get the staked and active service multisigs + # If the user has not tweeted in the last 24 hours, they're not a DAA + for user in self.context.ceramic_db.data["users"].values(): + + if not user["service_multisig"]: + continue + + if not user["tweets"]: + continue + + # Check the latest tweet time + tweet_ts = list(user["tweets"].values())[-1]["timestamp"] + tweet_time = datetime.fromtimestamp(tweet_ts, tz=timezone.utc) + + if (now_utc - tweet_time).total_seconds() > SECONDS_IN_DAY: + continue + + active_multisigs.append(user["service_multisig"]) + + self.context.logger.info(f"Safes marked as DAAs: {active_multisigs}") + + multi_send_txs = [] + for staked_multisig in active_multisigs: + + # Send an empty native transfer + multi_send_txs.append( + { + "operation": MultiSendOperation.CALL, + "to": staked_multisig, + "value": ZERO_VALUE, + "data": b"", + } + ) + + # Multisend call + contract_api_msg = yield from self.get_contract_api_response( + performative=ContractApiMessage.Performative.GET_RAW_TRANSACTION, # type: ignore + contract_address=self.params.multisend_address, + contract_id=str(MultiSendContract.contract_id), + contract_callable="get_tx_data", + multi_send_txs=multi_send_txs, + chain_id=BASE_CHAIN_ID, + ) + + # Check for errors + if ( + contract_api_msg.performative + != ContractApiMessage.Performative.RAW_TRANSACTION + ): + self.context.logger.error( + f"Could not get Multisend tx hash. " + f"Expected: {ContractApiMessage.Performative.RAW_TRANSACTION.value}, " + f"Actual: {contract_api_msg.performative.value}" + ) + return None + + # Extract the multisend data and strip the 0x + multisend_data = cast(str, contract_api_msg.raw_transaction.body["data"])[2:] + self.context.logger.info(f"Multisend data is {multisend_data}") + + # Prepare the safe transaction + safe_tx_hash = yield from self._build_safe_tx_hash( + to_address=self.params.multisend_address, + value=ZERO_VALUE, # the safe is not moving any native value into the multisend + data=bytes.fromhex(multisend_data), + operation=SafeOperation.DELEGATE_CALL.value + ) + + return safe_tx_hash + + class StakingRoundBehaviour(AbstractRoundBehaviour): """StakingRoundBehaviour""" @@ -442,5 +548,6 @@ class StakingRoundBehaviour(AbstractRoundBehaviour): behaviours: Set[Type[BaseBehaviour]] = [ ActivityScoreBehaviour, ActivityUpdatePreparationBehaviour, - CheckpointPreparationBehaviour + CheckpointPreparationBehaviour, + DAAPreparationBehaviour ] diff --git a/packages/valory/skills/staking_abci/fsm_specification.yaml b/packages/valory/skills/staking_abci/fsm_specification.yaml index fcf78254..587d70c8 100644 --- a/packages/valory/skills/staking_abci/fsm_specification.yaml +++ b/packages/valory/skills/staking_abci/fsm_specification.yaml @@ -8,17 +8,21 @@ final_states: - FinishedActivityRound - FinishedActivityUpdatePreparationRound - FinishedCheckpointPreparationRound +- FinishedDAAPreparationRound label: StakingAbciApp start_states: - ActivityScoreRound - CheckpointPreparationRound +- DAAPreparationRound states: - ActivityScoreRound - ActivityUpdatePreparationRound - CheckpointPreparationRound +- DAAPreparationRound - FinishedActivityRound - FinishedActivityUpdatePreparationRound - FinishedCheckpointPreparationRound +- FinishedDAAPreparationRound transition_func: (ActivityScoreRound, DONE): FinishedActivityRound (ActivityScoreRound, NO_MAJORITY): ActivityScoreRound @@ -30,3 +34,6 @@ transition_func: (CheckpointPreparationRound, DONE): FinishedCheckpointPreparationRound (CheckpointPreparationRound, NO_MAJORITY): CheckpointPreparationRound (CheckpointPreparationRound, ROUND_TIMEOUT): CheckpointPreparationRound + (DAAPreparationRound, DONE): FinishedDAAPreparationRound + (DAAPreparationRound, NO_MAJORITY): DAAPreparationRound + (DAAPreparationRound, ROUND_TIMEOUT): DAAPreparationRound diff --git a/packages/valory/skills/staking_abci/payloads.py b/packages/valory/skills/staking_abci/payloads.py index c2d7d5d2..7b9d52cc 100644 --- a/packages/valory/skills/staking_abci/payloads.py +++ b/packages/valory/skills/staking_abci/payloads.py @@ -50,3 +50,13 @@ class CheckpointPreparationPayload(BaseTxPayload): tx_hash: Optional[str] = None chain_id: str = "base" safe_contract_address: Optional[str] = None + + +@dataclass(frozen=True) +class DAAPreparationPayload(BaseTxPayload): + """Represent a transaction payload for the DAAPreparationRound.""" + + tx_submitter: Optional[str] = None + tx_hash: Optional[str] = None + chain_id: str = "base" + safe_contract_address: Optional[str] = None diff --git a/packages/valory/skills/staking_abci/rounds.py b/packages/valory/skills/staking_abci/rounds.py index 109535f5..137faed8 100644 --- a/packages/valory/skills/staking_abci/rounds.py +++ b/packages/valory/skills/staking_abci/rounds.py @@ -38,6 +38,7 @@ ActivityScorePayload, ActivityUpdatePreparationPayload, CheckpointPreparationPayload, + DAAPreparationPayload, ) @@ -183,6 +184,27 @@ class CheckpointPreparationRound(CollectSameUntilThresholdRound): # Event.DONE, Event.NO_MAJORITY, Event.ROUND_TIMEOUT +class DAAPreparationRound(CollectSameUntilThresholdRound): + """DAAPreparationRound""" + + payload_class = DAAPreparationPayload + synchronized_data_class = SynchronizedData + done_event = Event.DONE + no_majority_event = Event.NO_MAJORITY + collection_key = get_name(SynchronizedData.participant_to_checkpoint) + selection_key = ( + get_name(SynchronizedData.tx_submitter), + get_name(SynchronizedData.most_voted_tx_hash), + get_name(SynchronizedData.chain_id), + get_name(SynchronizedData.safe_contract_address), + ) + required_class_attributes = () + + # We reference all the events here to prevent the check-abciapp-specs tool from complaining + # since this round receives the event via payload + # Event.DONE, Event.NO_MAJORITY, Event.ROUND_TIMEOUT + + class FinishedActivityUpdatePreparationRound(DegenerateRound): """FinishedActivityUpdatePreparationRound""" @@ -195,11 +217,15 @@ class FinishedCheckpointPreparationRound(DegenerateRound): """FinishedCheckpointPreparationRound""" +class FinishedDAAPreparationRound(DegenerateRound): + """FinishedDAAPreparationRound""" + + class StakingAbciApp(AbciApp[Event]): """StakingAbciApp""" initial_round_cls: AppState = ActivityScoreRound - initial_states: Set[AppState] = {CheckpointPreparationRound, ActivityScoreRound} + initial_states: Set[AppState] = {CheckpointPreparationRound, ActivityScoreRound, DAAPreparationRound} transition_function: AbciAppTransitionFunction = { ActivityScoreRound: { Event.DONE: FinishedActivityRound, @@ -217,19 +243,27 @@ class StakingAbciApp(AbciApp[Event]): Event.NO_MAJORITY: CheckpointPreparationRound, Event.ROUND_TIMEOUT: CheckpointPreparationRound }, + DAAPreparationRound: { + Event.DONE: FinishedDAAPreparationRound, + Event.NO_MAJORITY: DAAPreparationRound, + Event.ROUND_TIMEOUT: DAAPreparationRound + }, FinishedActivityUpdatePreparationRound: {}, FinishedActivityRound: {}, - FinishedCheckpointPreparationRound: {} + FinishedCheckpointPreparationRound: {}, + FinishedDAAPreparationRound: {}, } - final_states: Set[AppState] = {FinishedCheckpointPreparationRound, FinishedActivityUpdatePreparationRound, FinishedActivityRound} + final_states: Set[AppState] = {FinishedCheckpointPreparationRound, FinishedActivityUpdatePreparationRound, FinishedActivityRound, FinishedDAAPreparationRound} event_to_timeout: EventToTimeout = {} cross_period_persisted_keys: FrozenSet[str] = frozenset() db_pre_conditions: Dict[AppState, Set[str]] = { CheckpointPreparationRound: set(), ActivityScoreRound: set(), + DAAPreparationRound: set(), } db_post_conditions: Dict[AppState, Set[str]] = { FinishedCheckpointPreparationRound: {"most_voted_tx_hash"}, FinishedActivityUpdatePreparationRound: {"most_voted_tx_hash"}, FinishedActivityRound: set(), + FinishedDAAPreparationRound: {"most_voted_tx_hash"}, } diff --git a/packages/valory/skills/staking_abci/skill.yaml b/packages/valory/skills/staking_abci/skill.yaml index d38a9b05..c56a2415 100644 --- a/packages/valory/skills/staking_abci/skill.yaml +++ b/packages/valory/skills/staking_abci/skill.yaml @@ -7,13 +7,13 @@ license: Apache-2.0 aea_version: '>=1.0.0, <2.0.0' fingerprint: __init__.py: bafybeie3oujhxxdr5s2lvc6cosbysezqycagw5mbwvxjw24k3dzcbtgg5m - behaviours.py: bafybeie3cthrwyxixacwddcrqxiejywfgso4337zsvj37ug3fgjziin3e4 + behaviours.py: bafybeihdzjrw72lhcnlhobr7g3zaejtnh667mv7lrnqdvp2465b3ybsu5u dialogues.py: bafybeifmmpyiwetlcgykczsq4dgwvm7tipdupf2rwcndg5cmtm7jfoxwxm - fsm_specification.yaml: bafybeidnl3i5e6xb7axpzg323xcj62rksrzvopuivcjnxkktcolanr2anu + fsm_specification.yaml: bafybeicjj2blynjtxejcjkr3fmb5mlvfxu4zpymqwurdciqvj5biz37ruu handlers.py: bafybeiaufft2fwbbjbbc77md6xkq7prnzzi2nkkm2fipapgx54myabmb7y models.py: bafybeify7lbvfd3j7inw3g6nr4yjdm2acnug6oavlxfmesj34kqpirtmiq - payloads.py: bafybeihuq7ckt22lzpapef5pfj4yzhcxlcvwnwxt6ewtejrtia2klo7tuq - rounds.py: bafybeiac5po5r2r2v2ku4vvxaaizxmhayndhwupv75wnut3wotbozivj3u + payloads.py: bafybeicwwo5rtm24ww6chetzqyg23tlgctrqww3c73tfsd2mxaehemiyyy + rounds.py: bafybeighcl5gekirysrmnnqveai7b3zfkmukhlaspi7egmnx5vlfhn7ccy fingerprint_ignore_patterns: [] connections: [] contracts: diff --git a/packages/valory/skills/twitter_scoring_abci/skill.yaml b/packages/valory/skills/twitter_scoring_abci/skill.yaml index 1da3f272..729ddbcc 100644 --- a/packages/valory/skills/twitter_scoring_abci/skill.yaml +++ b/packages/valory/skills/twitter_scoring_abci/skill.yaml @@ -32,7 +32,7 @@ protocols: - valory/contract_api:1.0.0:bafybeidgu7o5llh26xp3u3ebq3yluull5lupiyeu6iooi2xyymdrgnzq5i skills: - valory/abstract_round_abci:0.1.0:bafybeigjddhk7epta7xpnfvv426xedff5abh4xlkwi6cqgp4vkutgkvydm -- valory/decision_making_abci:0.1.0:bafybeibvhg6nzs7os3c4enox6cc6ey42kkh62jrv5jpb5kpcjmykeblwmi +- valory/decision_making_abci:0.1.0:bafybeie52kvwrsh4dyt45amlffclkdttclig33dyc4crb425zf2bcot36u - valory/mech_interact_abci:0.1.0:bafybeib4vn6m2yumwoclh5aatcdt5yxcjc5owxmxy5o7t3nfzormgwkr64 behaviours: main: diff --git a/scripts/ceramic/schemas/centaurs_stream_schema.json b/scripts/ceramic/schemas/centaurs_stream_schema.json index 2e29bd1c..8395d18e 100644 --- a/scripts/ceramic/schemas/centaurs_stream_schema.json +++ b/scripts/ceramic/schemas/centaurs_stream_schema.json @@ -158,6 +158,25 @@ "required": ["enabled", "last_run"], "additionalProperties": false }, + "staking_daa_config": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "daily": { + "type": "boolean" + }, + "last_run": { + "type": ["integer", "null", "string"] + }, + "run_hour_utc": { + "type": "integer" + } + }, + "required": ["enabled", "last_run", "daily", "run_hour_utc"], + "additionalProperties": false + }, "executionAttempt": { "type": "object", "properties": { @@ -345,9 +364,12 @@ }, "staking_checkpoint": { "$ref": "#/definitions/staking_checkpoint_config" + }, + "staking_daa": { + "$ref": "#/definitions/staking_daa_config" } }, - "required": ["daily_tweet", "scheduled_tweet", "daily_orbis", "week_in_olas"], + "required": ["daily_tweet", "scheduled_tweet", "daily_orbis", "week_in_olas", "twitter_campaigns", "staking_activity", "staking_checkpoint", "staking_daa"], "additionalProperties": false }, "memberWhitelist": { diff --git a/scripts/ceramic/schemas/default_centaurs_stream.json b/scripts/ceramic/schemas/default_centaurs_stream.json index 67da4e27..8f412e51 100644 --- a/scripts/ceramic/schemas/default_centaurs_stream.json +++ b/scripts/ceramic/schemas/default_centaurs_stream.json @@ -76,6 +76,12 @@ "staking_checkpoint": { "enabled": true, "last_run": null + }, + "staking_daa": { + "enabled": true, + "daily": true, + "last_run": null, + "run_hour_utc": 0 } }, "memberWhitelist": [] diff --git a/scripts/ceramic/streams.py b/scripts/ceramic/streams.py index f9ab536a..df24c9af 100644 --- a/scripts/ceramic/streams.py +++ b/scripts/ceramic/streams.py @@ -42,9 +42,6 @@ # CONTRIBUTE_PROD_CENTAURS_STREAM_ID = "kjzl6cwe1jw146h4892zlwow1hsefmbanwjc2aew4x0su5t4nqj0udtbpbtpb4h" # Nov 1st 2024 CONTRIBUTE_PROD_CENTAURS_STREAM_ID = "kjzl6cwe1jw14bibbud875n501nvjnk5ny2au1ouxvkcg62dk7q26zkai586smr" # Nov 8th 2024 -# Testing -# CONTRIBUTE_PROD_CENTAURS_STREAM_ID = "kjzl6cwe1jw149bcac7iiyr1dwc30fh5wqgj5nst9aokik9v1ik16hwm6q8p9db" # Nov 7th 2024 - # Manual scores DB # ----------------------------------------------------------------------------------------------------------------------- @@ -60,6 +57,7 @@ # CONTRIBUTE_CENTAURS_SCHEMA_COMMIT = "k3y52l7qbv1fry9bsoowbfvmjegm6ao5llv5p4dlppzt7ghyqsy87jk0b9m489qf4" # Until Oct 24th 2024 # CONTRIBUTE_CENTAURS_SCHEMA_COMMIT = "k3y52l7qbv1frybx3mnuqvs6lp4d53wdygae7lfnyc55ih5cob70ceu0bfwhk1e68" # Oct 24th 2024 -CONTRIBUTE_CENTAURS_SCHEMA_COMMIT = "k3y52l7qbv1frxkjy7gks27qieu3n6q41h8pgvfevr8kwxkly0hdxzqssbsh2cd1c" # Nov 8th 2024 +# CONTRIBUTE_CENTAURS_SCHEMA_COMMIT = "k3y52l7qbv1frxkjy7gks27qieu3n6q41h8pgvfevr8kwxkly0hdxzqssbsh2cd1c" # Nov 8th 2024 +CONTRIBUTE_CENTAURS_SCHEMA_COMMIT = "k3y52l7qbv1frxmcodzmem9bbzu5vjtx7c3rm1oikrdsib834esge1nbw6rit77y8" # Nov 29th 2024 CONTRIBUTE_GENERIC_SCHEMA_COMMIT = "k3y52l7qbv1fryi4j4lctbrusprz7vrip3l4ywga8e4rgpezqeplvq82s7p07teyo" diff --git a/scripts/check_rewards.py b/scripts/check_rewards.py index b2bc3bac..ac99fab5 100644 --- a/scripts/check_rewards.py +++ b/scripts/check_rewards.py @@ -167,14 +167,14 @@ def get_user_info(user_data: Dict, contract_info: Dict, contributors_contract: C staking_contract_name = get_contract_by_address(staking_contract_address) accrued_rewards = staking_token_contract.functions.calculateStakingReward(service_id).call() - this_epoch_rewards = staking_token_contract.functions.calculateStakingLastReward(service_id).call() + # this_epoch_rewards = staking_token_contract.functions.calculateStakingLastReward(service_id).call() # needs fixing this_epoch = contract_info[staking_contract_name]["epoch"] this_epoch_tweets = [t for t in user_data["tweets"].values() if t["epoch"] == this_epoch] this_epoch_points = sum(t["points"] for t in this_epoch_tweets) required_points = POINTS_PER_UPDATE * contract_info[staking_contract_name]['required_updates'] - color = YELLOW if this_epoch_points >= required_points and this_epoch_rewards == 0 else GREEN + color = GREEN if this_epoch_points >= required_points else YELLOW user_info = { "staked": True, @@ -184,7 +184,7 @@ def get_user_info(user_data: Dict, contract_info: Dict, contributors_contract: C "required_points": f"{required_points:4d}", "this_epoch_points": f"{this_epoch_points:4d}", "next_epoch_start": contract_info[staking_contract_name]["next_epoch_start"], - "this_epoch_rewards": f"{this_epoch_rewards / 1e18:6.2f}", + # "this_epoch_rewards": f"{this_epoch_rewards / 1e18:6.2f}", "accrued_rewards": f"{accrued_rewards / 1e18:6.2f}", "color": color } @@ -210,7 +210,7 @@ def print_table(): ) table = Table(title=f"Contribute staking status [{datetime.now().strftime('%H:%M:%S %Y-%m-%d')}]") - columns = ["User ID", "X handle", "Service Safe", "Contract", "Epoch", "Tweets", "Points (this epoch)", "Rewards (this epoch)", "Rewards (accrued)"] + columns = ["User ID", "X handle", "Service Safe", "Contract", "Epoch", "Tweets (this epoch)", "Points (this epoch)", "Rewards (accrued)"] for column in columns: table.add_column(column) @@ -230,7 +230,7 @@ def print_table(): user_info["epoch"] + f" [{user_info['next_epoch_start']}]", user_info["this_epoch_tweets"], user_info["this_epoch_points"] + " / " + user_info["required_points"], - user_info["this_epoch_rewards"], + # user_info["this_epoch_rewards"], user_info["accrued_rewards"], ] style = user_info["color"] @@ -244,7 +244,7 @@ def print_table(): UNSTAKED, UNSTAKED, UNSTAKED, - UNSTAKED, + # UNSTAKED, UNSTAKED, ] style = user_info["color"] diff --git a/scripts/migrate_ceramic_db.py b/scripts/migrate_ceramic_db.py index baecd9cd..6e4bfe0c 100644 --- a/scripts/migrate_ceramic_db.py +++ b/scripts/migrate_ceramic_db.py @@ -119,17 +119,11 @@ def main(): print("Updating the users db format...") - # Remove the module data - del user_db["module_data"]["staking_activity"] - - for user_data in user_db["users"].values(): - for tweet in user_data["tweets"].values(): - # Initialize the counted_for_activity - tweet["counted_for_activity"] = False + # Nothing to do # Validate the new data print("Validating the updated users db...") - with open(Path("ceramic", "schemas", "db_stream_schema.json"), "r", encoding="utf-8") as data_file: + with open(Path("scripts", "ceramic", "schemas", "db_stream_schema.json"), "r", encoding="utf-8") as data_file: stream_schema = json.load(data_file) jsonschema.validate(instance=user_db, schema=stream_schema) @@ -164,11 +158,17 @@ def main(): print("Updating the db format...") - # Nothing to do + + centaurs_db[0]["configuration"]["plugins"]["staking_daa"] = { + "enabled": True, + "daily": True, + "last_run": None, + "run_hour_utc": 0 + } # Validate the new data print("Validating the updated centaurs db...") - with open(Path("ceramic", "schemas", "centaurs_stream_schema.json"), "r", encoding="utf-8") as data_file: + with open(Path("scripts", "ceramic", "schemas", "centaurs_stream_schema.json"), "r", encoding="utf-8") as data_file: stream_schema = json.load(data_file) jsonschema.validate(instance=centaurs_db, schema=stream_schema)