diff --git a/testutil/sample/sample.go b/testutil/sample/sample.go index f1d1e56..4adac68 100644 --- a/testutil/sample/sample.go +++ b/testutil/sample/sample.go @@ -114,3 +114,9 @@ func ExtendedKeyPair(cfg chaincfg.Params) (string, string) { } return xprivKey.String(), xpubKey.String() } + +func TrustAnchor() machinetypes.TrustAnchor { + return machinetypes.TrustAnchor{ + Pubkey: PubKey, + } +} diff --git a/x/machine/keeper/msg_server_register_trust_anchor.go b/x/machine/keeper/msg_server_register_trust_anchor.go index 39c911c..886c6b0 100644 --- a/x/machine/keeper/msg_server_register_trust_anchor.go +++ b/x/machine/keeper/msg_server_register_trust_anchor.go @@ -2,16 +2,28 @@ package keeper import ( "context" + "errors" + + config "planetmint-go/config" + "planetmint-go/x/machine/types" sdk "github.com/cosmos/cosmos-sdk/types" - "planetmint-go/x/machine/types" ) func (k msgServer) RegisterTrustAnchor(goCtx context.Context, msg *types.MsgRegisterTrustAnchor) (*types.MsgRegisterTrustAnchorResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) - // TODO: Handling the message - _ = ctx + isValidTrustAnchorPubkey := validateExtendedPublicKey(msg.TrustAnchor.Pubkey, config.LiquidNetParams) + if !isValidTrustAnchorPubkey { + return nil, errors.New("invalid trust anchor pubkey") + } + + _, _, found := k.GetTrustAnchor(ctx, msg.TrustAnchor.Pubkey) + if found { + return nil, errors.New("trust anchor is already registered") + } + + k.StoreTrustAnchor(ctx, *msg.TrustAnchor, false) return &types.MsgRegisterTrustAnchorResponse{}, nil } diff --git a/x/machine/keeper/msg_server_test.go b/x/machine/keeper/msg_server_test.go index 39778cd..62a626f 100644 --- a/x/machine/keeper/msg_server_test.go +++ b/x/machine/keeper/msg_server_test.go @@ -46,3 +46,36 @@ func TestMsgServerAttestMachineInvalidLiquidKey(t *testing.T) { _, err := msgServer.AttestMachine(ctx, msg) assert.EqualError(t, err, "invalid liquid key") } + +func TestMsgServerRegisterTrustAnchor(t *testing.T) { + _, pk := sample.KeyPair() + ta := sample.TrustAnchor() + msg := types.NewMsgRegisterTrustAnchor(pk, &ta) + msgServer, ctx := setupMsgServer(t) + res, err := msgServer.RegisterTrustAnchor(ctx, msg) + if assert.NoError(t, err) { + assert.Equal(t, &types.MsgRegisterTrustAnchorResponse{}, res) + } +} + +func TestMsgServerRegisterTrustAnchorTwice(t *testing.T) { + _, pk := sample.KeyPair() + ta := sample.TrustAnchor() + msg := types.NewMsgRegisterTrustAnchor(pk, &ta) + msgServer, ctx := setupMsgServer(t) + res, err := msgServer.RegisterTrustAnchor(ctx, msg) + if assert.NoError(t, err) { + assert.Equal(t, &types.MsgRegisterTrustAnchorResponse{}, res) + } + _, err = msgServer.RegisterTrustAnchor(ctx, msg) + assert.EqualError(t, err, "trust anchor is already registered") +} + +func TestMsgServerRegisterTrustAnchorInvalidPubkey(t *testing.T) { + _, pk := sample.KeyPair() + ta := sample.TrustAnchor() + msg := types.NewMsgRegisterTrustAnchor(pk, &ta) + msgServer, ctx := setupMsgServer(t) + _, err := msgServer.RegisterTrustAnchor(ctx, msg) + assert.EqualError(t, err, "invalid trust anchor pubkey") +}