Skip to content
This repository has been archived by the owner on Oct 24, 2024. It is now read-only.

Commit

Permalink
impl register message
Browse files Browse the repository at this point in the history
  • Loading branch information
taryune committed Oct 18, 2023
1 parent 5d3d367 commit 577bf73
Show file tree
Hide file tree
Showing 7 changed files with 273 additions and 58 deletions.
10 changes: 9 additions & 1 deletion proto/mycel/registry/tx.proto
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ syntax = "proto3";

package mycel.registry;

import "gogoproto/gogo.proto";
import "cosmos/base/v1beta1/coin.proto";

option go_package = "github.com/mycel-domain/mycel/x/registry/types";

// Msg defines the Msg service.
Expand Down Expand Up @@ -54,5 +57,10 @@ message MsgWithdrawRegistrationFee {
string name = 2;
}

message MsgWithdrawRegistrationFeeResponse {}
message MsgWithdrawRegistrationFeeResponse {
repeated cosmos.base.v1beta1.Coin registrationFees = 7 [
(gogoproto.nullable) = false,
(gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"
];
}

11 changes: 6 additions & 5 deletions x/registry/keeper/msg_server_register_top_level_domain.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,12 @@ func (k msgServer) RegisterTopLevelDomain(goCtx context.Context, msg *types.MsgR

defaultRegistrationConfig := types.GetDefaultSubdomainConfig(3030)
domain := types.TopLevelDomain{
Name: msg.Name,
ExpirationDate: expirationDate.UnixNano(),
Metadata: nil,
SubdomainConfig: &defaultRegistrationConfig,
AccessControl: accessControl,
Name: msg.Name,
ExpirationDate: expirationDate.UnixNano(),
Metadata: nil,
SubdomainConfig: &defaultRegistrationConfig,
AccessControl: accessControl,
RegistrationFees: sdk.NewCoins(),
}

err = k.Keeper.RegisterTopLevelDomain(ctx, domain, creatorAddress, msg.RegistrationPeriodInYear)
Expand Down
41 changes: 40 additions & 1 deletion x/registry/keeper/msg_server_withdraw_registration_fee.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package keeper
import (
"context"

errorsmod "cosmossdk.io/errors"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/mycel-domain/mycel/x/registry/types"
)
Expand All @@ -13,5 +14,43 @@ func (k msgServer) WithdrawRegistrationFee(goCtx context.Context, msg *types.Msg
// TODO: Handling the message
_ = ctx

return &types.MsgWithdrawRegistrationFeeResponse{}, nil
// Get top level domain
topLevelDomain, found := k.Keeper.GetTopLevelDomain(ctx, msg.Name)
if !found {
return nil, errorsmod.Wrapf(types.ErrDomainNotFound, "%s", msg.Name)
}

if topLevelDomain.RegistrationFees.IsZero() {
// return nil, errorsmod.Wrapf(types.ErrNoRegistrationFeesToWithdraw, "%s", msg.Name)
}

// Check if the creator is the owner of the domain
role, ok := topLevelDomain.AccessControl[msg.Creator]
if !ok || role != types.DomainRole_OWNER {
return nil, errorsmod.Wrapf(types.ErrNoPermissionToWithdrawFees, "%s", msg.Creator)
}

// Send coins from module account to Creator
creatorAddress, err := sdk.AccAddressFromBech32(msg.Creator)
if err != nil {
return nil, err
}

registrationFees := topLevelDomain.RegistrationFees
err = k.Keeper.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, creatorAddress, registrationFees)
if err != nil {
return nil, err
}
topLevelDomain.RegistrationFees = sdk.NewCoins()
k.Keeper.SetTopLevelDomain(ctx, topLevelDomain)

// Emit event
ctx.EventManager().EmitEvent(
sdk.NewEvent(types.EventTypeWithdrawRegistrationFees,
sdk.NewAttribute(types.AttributeWithdrawRegistrationFeesEventDomainName, msg.Name),
sdk.NewAttribute(types.AttributeWithdrawRegistrationFeesEventDomainFees, registrationFees.String()),
),
)

return &types.MsgWithdrawRegistrationFeeResponse{RegistrationFees: registrationFees}, nil
}
85 changes: 85 additions & 0 deletions x/registry/keeper/msg_server_withdraw_registration_fee_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package keeper_test

import (
"fmt"

errorsmod "cosmossdk.io/errors"
sdk "github.com/cosmos/cosmos-sdk/types"

"github.com/mycel-domain/mycel/testutil"
"github.com/mycel-domain/mycel/x/registry/types"
)

func (suite *KeeperTestSuite) TestWithdrawRegistrationFee() {
testCases := []struct {
withdrawer string
topLevelDomainName string
expErr error
fn func()
}{
{
withdrawer: testutil.Alice,
topLevelDomainName: "bar",
},
{
withdrawer: testutil.Bob,
topLevelDomainName: "bar",
expErr: errorsmod.Wrapf(types.ErrNoPermissionToWithdrawFees, "%s", testutil.Bob),
},
}

for i, tc := range testCases {
suite.Run(fmt.Sprintf("Case %d", i), func() {
suite.SetupTest()

// Register top level domain
registerTopLevelDomainMsg := &types.MsgRegisterTopLevelDomain{
Creator: testutil.Alice,
Name: tc.topLevelDomainName,
RegistrationPeriodInYear: 1,
}
_, err := suite.msgServer.RegisterTopLevelDomain(suite.ctx, registerTopLevelDomainMsg)
suite.Require().Nil(err)

// Register second level domain
registerSecondLevelDomainMsg := &types.MsgRegisterSecondLevelDomain{
Creator: testutil.Bob,
Name: "foo",
Parent: tc.topLevelDomainName,
RegistrationPeriodInYear: 1,
}
_, err = suite.msgServer.RegisterSecondLevelDomain(suite.ctx, registerSecondLevelDomainMsg)
suite.Require().Nil(err)

// Before balance
withdrawerAddress, err := sdk.AccAddressFromBech32(tc.withdrawer)
suite.Require().Nil(err)
beforeBalance := suite.app.BankKeeper.GetAllBalances(suite.ctx, withdrawerAddress)

// Withdraw registration fee
withdrawMsg := &types.MsgWithdrawRegistrationFee{
Creator: tc.withdrawer,
Name: tc.topLevelDomainName,
}
fees, err := suite.msgServer.WithdrawRegistrationFee(suite.ctx, withdrawMsg)

if tc.expErr == nil {
suite.Require().Nil(err)

// Check event
events, found := testutil.FindEventsByType(suite.ctx.EventManager().Events(), types.EventTypeWithdrawRegistrationFees)
suite.Require().True(found)
for _, event := range events {
suite.Require().Equal(tc.topLevelDomainName, event.Attributes[0].Value)
suite.Require().Equal(fees.RegistrationFees.String(), event.Attributes[1].Value)
}

// Check balance
afterBalance := suite.app.BankKeeper.GetAllBalances(suite.ctx, withdrawerAddress)
suite.Require().Equal(beforeBalance.Add(fees.RegistrationFees...), afterBalance)
} else {
suite.Require().EqualError(err, tc.expErr.Error())
}
})
}
}
35 changes: 19 additions & 16 deletions x/registry/types/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,23 @@ import (

// x/mycel module sentinel errors
var (
ErrSample = errorsmod.Register(ModuleName, 1100, "sample error")
ErrDomainIsAlreadyTaken = errorsmod.Register(ModuleName, 1101, "domain is already taken")
ErrInvalidDomainName = errorsmod.Register(ModuleName, 1102, "invalid name")
ErrInvalidDomainParent = errorsmod.Register(ModuleName, 1103, "invalid parent")
ErrDomainNotFound = errorsmod.Register(ModuleName, 1104, "domain not found")
ErrInvalidWalletAddress = errorsmod.Register(ModuleName, 1105, "invalid wallet address")
ErrInvalidWalletRecordType = errorsmod.Register(ModuleName, 1106, "invalid wallet record type")
ErrInvalidDnsRecordValue = errorsmod.Register(ModuleName, 1107, "invalid dns record value")
ErrInvalidDnsRecordType = errorsmod.Register(ModuleName, 1108, "invalid dns record type")
ErrDomainNotEditable = errorsmod.Register(ModuleName, 1109, "role not pemitted to edit the domain")
ErrParentDomainDoesNotExist = errorsmod.Register(ModuleName, 1110, "parent domain does not exist")
ErrParentDomainMustBeEmpty = errorsmod.Register(ModuleName, 1111, "parent domain must be empty")
ErrDomainNotRegistrable = errorsmod.Register(ModuleName, 1112, "domain is not registrable")
ErrMaxSubdomainCountReached = errorsmod.Register(ModuleName, 1113, "max subdomain count reached")
ErrInvalidRegistrationPeriod = errorsmod.Register(ModuleName, 1114, "invalid registration period")
ErrDomainExpired = errorsmod.Register(ModuleName, 1115, "domain expired")
ErrSample = errorsmod.Register(ModuleName, 1100, "sample error")
ErrDomainIsAlreadyTaken = errorsmod.Register(ModuleName, 1101, "domain is already taken")
ErrInvalidDomainName = errorsmod.Register(ModuleName, 1102, "invalid name")
ErrInvalidDomainParent = errorsmod.Register(ModuleName, 1103, "invalid parent")
ErrDomainNotFound = errorsmod.Register(ModuleName, 1104, "domain not found")
ErrInvalidWalletAddress = errorsmod.Register(ModuleName, 1105, "invalid wallet address")
ErrInvalidWalletRecordType = errorsmod.Register(ModuleName, 1106, "invalid wallet record type")
ErrInvalidDnsRecordValue = errorsmod.Register(ModuleName, 1107, "invalid dns record value")
ErrInvalidDnsRecordType = errorsmod.Register(ModuleName, 1108, "invalid dns record type")
ErrDomainNotEditable = errorsmod.Register(ModuleName, 1109, "role not pemitted to edit the domain")
ErrParentDomainDoesNotExist = errorsmod.Register(ModuleName, 1110, "parent domain does not exist")
ErrParentDomainMustBeEmpty = errorsmod.Register(ModuleName, 1111, "parent domain must be empty")
ErrDomainNotRegistrable = errorsmod.Register(ModuleName, 1112, "domain is not registrable")
ErrMaxSubdomainCountReached = errorsmod.Register(ModuleName, 1113, "max subdomain count reached")
ErrInvalidRegistrationPeriod = errorsmod.Register(ModuleName, 1114, "invalid registration period")
ErrDomainExpired = errorsmod.Register(ModuleName, 1115, "domain expired")
ErrNoEnoughBalance = errorsmod.Register(ModuleName, 1116, "no enough balance")
ErrNoPermissionToWithdrawFees = errorsmod.Register(ModuleName, 1117, "no permission to withdraw fees")
ErrNoRegistrationFeesToWithdraw = errorsmod.Register(ModuleName, 1118, "no registration fees to withdraw")
)
14 changes: 11 additions & 3 deletions x/registry/types/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ package types
const (
EventTypeRegsterDomain = "register-domain"

AttributeRegisterSecondLevelDomainEventName = "name"
AttributeRegisterSecondLevelDomainEventParent = "parent"
AttributeRegisterSecondLevelDomainEventExpirationDate = "expiration-date"
AttributeRegisterSecondLevelDomainEventName = "name"
AttributeRegisterSecondLevelDomainEventParent = "parent"
AttributeRegisterSecondLevelDomainEventExpirationDate = "expiration-date"
AttributeRegisterSecondLevelDomainEventRegistrationFee = "registration-fee"
)

Expand Down Expand Up @@ -37,3 +37,11 @@ const (
AttributeUpdateDnsRecordEventDnsRecordType = "dns-record-type"
AttributeUpdateDnsRecordEventValue = "value"
)

// Withdraw fees event
const (
EventTypeWithdrawRegistrationFees = "withdraw-registration-fees"

AttributeWithdrawRegistrationFeesEventDomainName = "name"
AttributeWithdrawRegistrationFeesEventDomainFees = "fees"
)
Loading

0 comments on commit 577bf73

Please sign in to comment.