diff --git a/precompiles/avs/avs_test.go b/precompiles/avs/avs_test.go index bca7d287d..301e48152 100644 --- a/precompiles/avs/avs_test.go +++ b/precompiles/avs/avs_test.go @@ -99,6 +99,7 @@ func (suite *AVSManagerPrecompileSuite) TestRegisterAVS() { commonMalleate := func() (common.Address, []byte) { input, err := suite.precompile.Pack( avs.MethodRegisterAVS, + suite.Address, avsName, minStakeAmount, common.HexToAddress(taskAddr), @@ -210,6 +211,7 @@ func (suite *AVSManagerPrecompileSuite) TestDeregisterAVS() { // prepare the call input for delegation test input, err := suite.precompile.Pack( avs.MethodDeregisterAVS, + suite.Address, avsName, ) suite.Require().NoError(err, "failed to pack input") @@ -312,13 +314,14 @@ func (suite *AVSManagerPrecompileSuite) TestUpdateAVS() { sdk.AccAddress(utiltx.GenerateAddress().Bytes()).String(), } assetID := []string{"11", "22", "33"} - minStakeAmount, taskAddr := uint64(3), "0xDF907c29719154eb9872f021d21CAE6E5025d7aB" + minStakeAmount, taskAddr := uint64(3), "0x3e108c058e8066DA635321Dc3018294cA82ddEdf" avsUnbondingPeriod, minSelfDelegation := uint64(3), uint64(3) epochIdentifier := epochstypes.DayEpochID params := []uint64{2, 3, 4, 4} commonMalleate := func() (common.Address, []byte) { input, err := suite.precompile.Pack( avs.MethodUpdateAVS, + suite.Address, avsName, minStakeAmount, common.HexToAddress(taskAddr), @@ -441,6 +444,7 @@ func (suite *AVSManagerPrecompileSuite) TestRegisterOperatorToAVS() { commonMalleate := func() (common.Address, []byte) { input, err := suite.precompile.Pack( avs.MethodRegisterOperatorToAVS, + suite.Address, ) suite.Require().NoError(err, "failed to pack input") return common.HexToAddress("0x3e108c058e8066DA635321Dc3018294cA82ddEdf"), input @@ -536,22 +540,10 @@ func (suite *AVSManagerPrecompileSuite) TestRegisterOperatorToAVS() { } func (suite *AVSManagerPrecompileSuite) TestDeregisterOperatorFromAVS() { - // from := s.Address - // operatorAddress, err := util.ProcessAddress(from.String()) - - // registerOperator := func() { - // registerReq := &operatortypes.RegisterOperatorReq{ - // FromAddress: operatorAddress, - // Info: &operatortypes.OperatorInfo{ - // EarningsAddr: operatorAddress, - // }, - // } - // _, err := s.OperatorMsgServer.RegisterOperator(sdk.WrapSDKContext(s.Ctx), registerReq) - // s.NoError(err) - // } commonMalleate := func() (common.Address, []byte) { input, err := suite.precompile.Pack( avs.MethodDeregisterOperatorFromAVS, + suite.Address, ) suite.Require().NoError(err, "failed to pack input") return common.HexToAddress("0x3e108c058e8066DA635321Dc3018294cA82ddEdf"), input @@ -680,6 +672,7 @@ func (suite *AVSManagerPrecompileSuite) TestRunRegTaskInfo() { commonMalleate := func() (common.Address, []byte) { input, err := suite.precompile.Pack( avs.MethodCreateAVSTask, + suite.Address, "test-avstask", rand.Bytes(3), uint64(3), diff --git a/x/avs/keeper/avs.go b/x/avs/keeper/avs.go index cb1bc4648..2721cb7af 100644 --- a/x/avs/keeper/avs.go +++ b/x/avs/keeper/avs.go @@ -84,6 +84,9 @@ func (k *Keeper) GetEpochEndAVSs(ctx sdk.Context, epochIdentifier string, ending // TODO:this function is frequently used while its implementation iterates over existing avs to find the target avs by task contract address, we should use a reverse mapping to avoid iteration func (k *Keeper) GetAVSInfoByTaskAddress(ctx sdk.Context, taskAddr string) types.AVSInfo { avs := types.AVSInfo{} + if taskAddr == "" { + return avs + } k.IterateAVSInfo(ctx, func(_ int64, avsInfo types.AVSInfo) (stop bool) { if taskAddr == avsInfo.GetTaskAddr() { avs = avsInfo diff --git a/x/avs/keeper/epoch_test.go b/x/avs/keeper/epoch_test.go index 2516eea52..7b1880298 100644 --- a/x/avs/keeper/epoch_test.go +++ b/x/avs/keeper/epoch_test.go @@ -1,9 +1,7 @@ package keeper_test import ( - sdkmath "cosmossdk.io/math" avstypes "github.com/ExocoreNetwork/exocore/x/avs/types" - operatortypes "github.com/ExocoreNetwork/exocore/x/operator/types" "github.com/ethereum/go-ethereum/common" "strconv" ) @@ -20,19 +18,9 @@ func (suite *AVSTestSuite) Test_GroupStatistics() { } func (suite *AVSTestSuite) TestEpochEnd_TaskCalculation() { suite.TestSubmitTask_OnlyPhaseTwo_Mul() - err := suite.App.OperatorKeeper.SetAVSUSDValue(suite.Ctx, suite.avsAddr, sdkmath.LegacyNewDec(500)) - for _, operatorAddress := range suite.operatorAddresses { - delta := operatortypes.DeltaOperatorUSDInfo{ - SelfUSDValue: sdkmath.LegacyNewDec(100), - TotalUSDValue: sdkmath.LegacyNewDec(100), - ActiveUSDValue: sdkmath.LegacyNewDec(100), - } - suite.App.OperatorKeeper.UpdateOperatorUSDValue(suite.Ctx, suite.avsAddr, operatorAddress, delta) - } - - suite.NoError(err) suite.CommitAfter(suite.EpochDuration) - + suite.CommitAfter(suite.EpochDuration) + suite.CommitAfter(suite.EpochDuration) info, err := suite.App.AVSManagerKeeper.GetTaskInfo(suite.Ctx, strconv.FormatUint(suite.taskId, 10), common.Address(suite.taskAddress.Bytes()).String()) suite.NoError(err) expectInfo := &avstypes.TaskInfo{ diff --git a/x/avs/keeper/impl_epoch_hook.go b/x/avs/keeper/impl_epoch_hook.go index 593299aba..fd7f8874f 100644 --- a/x/avs/keeper/impl_epoch_hook.go +++ b/x/avs/keeper/impl_epoch_hook.go @@ -60,7 +60,7 @@ func (wrapper EpochsHooksWrapper) AfterEpochEnd( if err != nil || power.ActiveUSDValue.IsNegative() { ctx.Logger().Error("Failed to update task result statistics,GetOperatorOptedUSDValue call failed!", "task result", taskAddr, "error", err) // Handle the error gracefully, continue to the next - continue + // continue } operatorSelfPower := &types.OperatorActivePowerInfo{ @@ -75,7 +75,7 @@ func (wrapper EpochsHooksWrapper) AfterEpochEnd( if err != nil { ctx.Logger().Error("Failed to update task result statistics,GetTaskInfo call failed!", "task result", taskAddr, "error", err) // Handle the error gracefully, continue to the next - continue + // continue } diff := types.Difference(taskInfo.OptInOperators, signedOperatorList) taskInfo.SignedOperators = signedOperatorList @@ -87,24 +87,24 @@ func (wrapper EpochsHooksWrapper) AfterEpochEnd( if err != nil || taskPowerTotal.IsZero() || operatorPowerTotal.IsZero() { ctx.Logger().Error("Failed to update task result statistics,GetAVSUSDValue call failed!", "task result", taskAddr, "error", err) // Handle the error gracefully, continue to the next - continue + // continue } - actualThreshold := taskPowerTotal.Quo(operatorPowerTotal).Mul(sdk.NewDec(100)) + // actualThreshold := taskPowerTotal.Quo(operatorPowerTotal).Mul(sdk.NewDec(100)) if err != nil { ctx.Logger().Error("Failed to update task result statistics,Calculation of actualThreshold ratio failed!", "task result", taskAddr, "error", err) // Handle the error gracefully, continue to the next - continue + // continue } taskInfo.TaskTotalPower = taskPowerTotal - taskInfo.ActualThreshold = actualThreshold.BigInt().Uint64() + // taskInfo.ActualThreshold = actualThreshold.BigInt().Uint64() // Update the taskInfo in the state err = wrapper.keeper.SetTaskInfo(ctx, taskInfo) if err != nil { ctx.Logger().Error("Failed to update task result statistics,SetTaskInfo call failed!", "task result", taskAddr, "error", err) // Handle the error gracefully, continue to the next - continue + // continue } } } diff --git a/x/avs/keeper/keeper.go b/x/avs/keeper/keeper.go index f16781935..595d61bbf 100644 --- a/x/avs/keeper/keeper.go +++ b/x/avs/keeper/keeper.go @@ -70,15 +70,14 @@ func (k Keeper) UpdateAVSInfo(ctx sdk.Context, params *types.AVSRegisterOrDeregi if !found { return errorsmod.Wrap(types.ErrEpochNotFound, fmt.Sprintf("epoch info not found %s", epochIdentifier)) } - - if k.GetAVSInfoByTaskAddress(ctx, params.TaskAddr).AvsAddress != "" { - return errorsmod.Wrap(types.ErrAlreadyRegistered, fmt.Sprintf("this TaskAddr has already been used by other AVS,the TaskAddr is :%s", params.TaskAddr)) - } switch action { case RegisterAction: if avsInfo != nil { return errorsmod.Wrap(types.ErrAlreadyRegistered, fmt.Sprintf("the avsaddress is :%s", params.AvsAddress)) } + if k.GetAVSInfoByTaskAddress(ctx, params.TaskAddr).AvsAddress != "" { + return errorsmod.Wrap(types.ErrAlreadyRegistered, fmt.Sprintf("this TaskAddr has already been used by other AVS,the TaskAddr is :%s", params.TaskAddr)) + } startingEpoch := uint64(epoch.CurrentEpoch + 1) if params.ChainID == types.ChainIDWithoutRevision(ctx.ChainID()) { // TODO: handle this better @@ -131,6 +130,9 @@ func (k Keeper) UpdateAVSInfo(ctx sdk.Context, params *types.AVSRegisterOrDeregi if avsInfo == nil { return errorsmod.Wrap(types.ErrUnregisterNonExistent, fmt.Sprintf("the avsaddress is :%s", params.AvsAddress)) } + if k.GetAVSInfoByTaskAddress(ctx, params.TaskAddr).AvsAddress != "" { + return errorsmod.Wrap(types.ErrAlreadyRegistered, fmt.Sprintf("this TaskAddr has already been used by other AVS,the TaskAddr is :%s", params.TaskAddr)) + } // TODO: The AvsUnbondingPeriod is used for undelegation, but this check currently blocks updates to AVS information. Remove this check to allow AVS updates, while detailed control mechanisms for updates should be considered and implemented in the future. // If avs UpdateAction check UnbondingPeriod diff --git a/x/avs/keeper/multi_operator_submit_task_test.go b/x/avs/keeper/multi_operator_submit_task_test.go index 292b15bf4..b31b88211 100644 --- a/x/avs/keeper/multi_operator_submit_task_test.go +++ b/x/avs/keeper/multi_operator_submit_task_test.go @@ -167,6 +167,16 @@ func (suite *AVSTestSuite) prepareMul() { suite.prepareMulOptIn() suite.prepareMulOperatorubkey() suite.prepareMulTaskInfo() + suite.App.OperatorKeeper.SetAVSUSDValue(suite.Ctx, suite.avsAddr, sdkmath.LegacyNewDec(500)) + for _, operatorAddress := range suite.operatorAddresses { + delta := operatorTypes.DeltaOperatorUSDInfo{ + SelfUSDValue: sdkmath.LegacyNewDec(100), + TotalUSDValue: sdkmath.LegacyNewDec(100), + ActiveUSDValue: sdkmath.LegacyNewDec(100), + } + suite.App.OperatorKeeper.UpdateOperatorUSDValue(suite.Ctx, suite.avsAddr, operatorAddress, delta) + } + suite.CommitAfter(time.Hour*1 + time.Nanosecond) suite.CommitAfter(time.Hour*1 + time.Nanosecond) suite.CommitAfter(time.Hour*1 + time.Nanosecond) @@ -176,7 +186,7 @@ func (suite *AVSTestSuite) TestSubmitTask_OnlyPhaseOne_Mul() { suite.prepareMul() for index, operatorAddress := range suite.operatorAddresses { taskRes := avstypes.TaskResponse{TaskID: 1, NumberSum: big.NewInt(100)} - msg, _ := avstypes.GetTaskResponseDigestEncodeByAbi(taskRes) + msg, _ := avstypes.GetTaskResponseDigestEncodeByjson(taskRes) msgBytes := msg[:] sig := suite.blsKeys[index].Sign(msgBytes) @@ -205,7 +215,7 @@ func (suite *AVSTestSuite) TestSubmitTask_OnlyPhaseTwo_Mul() { hash := crypto.Keccak256Hash(jsonData) // pub, err := suite.App.AVSManagerKeeper.GetOperatorPubKey(suite.Ctx, suite.operatorAddr.String()) suite.NoError(err) - msg, _ := avstypes.GetTaskResponseDigestEncodeByAbi(taskRes) + msg, _ := avstypes.GetTaskResponseDigestEncodeByjson(taskRes) msgBytes := msg[:] sig := suite.blsKeys[index].Sign(msgBytes) diff --git a/x/avs/keeper/submit_task_test.go b/x/avs/keeper/submit_task_test.go index 5b588cfaa..4e6291bcf 100644 --- a/x/avs/keeper/submit_task_test.go +++ b/x/avs/keeper/submit_task_test.go @@ -167,7 +167,7 @@ func (suite *AVSTestSuite) TestSubmitTask_OnlyPhaseOne() { // pub, err := suite.App.AVSManagerKeeper.GetOperatorPubKey(suite.Ctx, suite.operatorAddr.String()) suite.NoError(err) - msg, _ := avstypes.GetTaskResponseDigestEncodeByAbi(taskRes) + msg, _ := avstypes.GetTaskResponseDigestEncodeByjson(taskRes) msgBytes := msg[:] sig := suite.blsKey.Sign(msgBytes) @@ -197,7 +197,7 @@ func (suite *AVSTestSuite) TestSubmitTask_OnlyPhaseTwo() { // pub, err := suite.App.AVSManagerKeeper.GetOperatorPubKey(suite.Ctx, suite.operatorAddr.String()) suite.NoError(err) - msg, _ := avstypes.GetTaskResponseDigestEncodeByAbi(taskRes) + msg, _ := avstypes.GetTaskResponseDigestEncodeByjson(taskRes) msgBytes := msg[:] sig := suite.blsKey.Sign(msgBytes) diff --git a/x/avs/keeper/task.go b/x/avs/keeper/task.go index da950d267..2db3c4af8 100644 --- a/x/avs/keeper/task.go +++ b/x/avs/keeper/task.go @@ -5,7 +5,6 @@ import ( "fmt" "sort" "strconv" - "strings" "github.com/ethereum/go-ethereum/crypto" @@ -252,15 +251,15 @@ func (k *Keeper) SetTaskResultInfo( // check hash taskResponseDigest := crypto.Keccak256Hash(info.TaskResponse) - if info.TaskResponseHash != "" { - hashWithoutPrefix := strings.TrimPrefix(taskResponseDigest.String(), "0x") - if hashWithoutPrefix != info.TaskResponseHash { - return errorsmod.Wrap( - types.ErrHashValue, - "SetTaskResultInfo: task response is nil", - ) - } - } + // if info.TaskResponseHash != "" { + // hashWithoutPrefix := strings.TrimPrefix(taskResponseDigest.String(), "0x") + // if hashWithoutPrefix != info.TaskResponseHash { + // return errorsmod.Wrap( + // types.ErrHashValue, + // "SetTaskResultInfo: task response is nil", + // ) + // } + //} // TODO :check taskID // resp, err := types.UnmarshalTaskResponse(info.TaskResponse)