Skip to content

Commit

Permalink
add check for value denom before setting nav, add msg server test for…
Browse files Browse the repository at this point in the history
… adding nav
  • Loading branch information
nullpointer0x00 committed Aug 4, 2023
1 parent 06ed285 commit 0ad7b47
Show file tree
Hide file tree
Showing 2 changed files with 128 additions and 6 deletions.
8 changes: 6 additions & 2 deletions x/marker/keeper/msg_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -821,7 +821,7 @@ func (k msgServer) AddNetAssetValue(goCtx context.Context, msg *types.MsgAddNetA

marker, err := k.GetMarkerByDenom(ctx, msg.Denom)
if err != nil {
return nil, sdkerrors.ErrInvalidRequest.Wrapf("marker not found for %s: %v", msg.Denom, err)
return nil, sdkerrors.ErrInvalidRequest.Wrap(err.Error())
}

if marker.GetStatus() != types.StatusProposed {
Expand All @@ -832,6 +832,10 @@ func (k msgServer) AddNetAssetValue(goCtx context.Context, msg *types.MsgAddNetA
if nav.Value.Denom == marker.GetDenom() {
return nil, sdkerrors.ErrInvalidRequest.Wrapf("net asset value denom cannot match marker denom %q", marker.GetDenom())
}
_, err := k.GetMarkerByDenom(ctx, nav.Value.Denom)
if err != nil {
return nil, sdkerrors.ErrInvalidRequest.Wrapf("net asset value denom does not exist: %v", err.Error())
}
if nav.UpdateTime.UTC().After(ctx.BlockTime().UTC()) { // TODO: not sure if we should update this to current block time here or allow user to state the update time.
return nil, sdkerrors.ErrInvalidRequest.Wrapf("net asset value update time (%v) is later than current block time (%v)", nav.UpdateTime.UTC(), ctx.BlockTime().UTC())
}
Expand All @@ -856,7 +860,7 @@ func (k msgServer) DeleteNetAssetValue(goCtx context.Context, msg *types.MsgDele

marker, err := k.GetMarkerByDenom(ctx, msg.Denom)
if err != nil {
return nil, sdkerrors.ErrInvalidRequest.Wrapf("marker not found for %s : %v", msg.Denom, err)
return nil, sdkerrors.ErrInvalidRequest.Wrap(err.Error())
}

Check warning on line 864 in x/marker/keeper/msg_server.go

View check run for this annotation

Codecov / codecov/patch

x/marker/keeper/msg_server.go#L858-L864

Added lines #L858 - L864 were not covered by tests

if marker.GetStatus() != types.StatusProposed {
Expand Down
126 changes: 122 additions & 4 deletions x/marker/keeper/msg_server_test.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package keeper_test

import (
"fmt"
"testing"
"time"

"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
Expand All @@ -21,9 +23,10 @@ import (
type MsgServerTestSuite struct {
suite.Suite

app *simapp.App
ctx sdk.Context
msgServer types.MsgServer
app *simapp.App
ctx sdk.Context
msgServer types.MsgServer
blockStartTime time.Time

privkey1 cryptotypes.PrivKey
pubkey1 cryptotypes.PubKey
Expand All @@ -36,8 +39,11 @@ type MsgServerTestSuite struct {

func (s *MsgServerTestSuite) SetupTest() {

s.blockStartTime = time.Now()
s.app = simapp.Setup(s.T())
s.ctx = s.app.BaseApp.NewContext(false, tmproto.Header{})
s.ctx = s.app.BaseApp.NewContext(false, tmproto.Header{
Time: s.blockStartTime,
})
s.msgServer = markerkeeper.NewMsgServerImpl(s.app.MarkerKeeper)

s.privkey1 = secp256k1.GenPrivKey()
Expand Down Expand Up @@ -343,3 +349,115 @@ func (s *MsgServerTestSuite) TestUpdateSendDenyList() {
})
}
}

func (s *MsgServerTestSuite) TestAddNetAssetValue() {
authUser := testUserAddress("test")

markerDenom := "jackthecat"
markerAcct := authtypes.NewBaseAccount(types.MustGetMarkerAddress(markerDenom), nil, 0, 0)
s.app.MarkerKeeper.SetMarker(s.ctx, types.NewMarkerAccount(markerAcct, sdk.NewInt64Coin(markerDenom, 1000), authUser, []types.AccessGrant{{Address: authUser.String(), Permissions: []types.Access{types.Access_Transfer}}}, types.StatusProposed, types.MarkerType_RestrictedCoin, true, false, false, []string{}))

valueDenom := "usd"
valueAcct := authtypes.NewBaseAccount(types.MustGetMarkerAddress(valueDenom), nil, 0, 0)
s.app.MarkerKeeper.SetMarker(s.ctx, types.NewMarkerAccount(valueAcct, sdk.NewInt64Coin(valueDenom, 1000), authUser, []types.AccessGrant{{Address: authUser.String(), Permissions: []types.Access{types.Access_Transfer}}}, types.StatusProposed, types.MarkerType_RestrictedCoin, true, false, false, []string{}))

finalizedMarkerDenom := "finalizedjackthecat"
finalizedMarkerAcct := authtypes.NewBaseAccount(types.MustGetMarkerAddress(finalizedMarkerDenom), nil, 1, 0)
s.app.MarkerKeeper.SetMarker(s.ctx, types.NewMarkerAccount(finalizedMarkerAcct, sdk.NewInt64Coin(finalizedMarkerDenom, 1000), authUser, []types.AccessGrant{{Address: authUser.String(), Permissions: []types.Access{types.Access_Transfer}}}, types.StatusFinalized, types.MarkerType_RestrictedCoin, true, false, false, []string{}))

testCases := []struct {
name string
msg types.MsgAddNetAssetValueRequest
expErr string
}{
{
name: "no marker found",
msg: types.MsgAddNetAssetValueRequest{Denom: "cantfindme", NetAssetValues: []types.NetAssetValue{}, Administrator: authUser.String()},
expErr: "marker cantfindme not found for address: cosmos17l2yneua2mdfqaycgyhqag8t20asnjwf6adpmt: invalid request",
},
{
name: "empty net asset values",
msg: types.MsgAddNetAssetValueRequest{Denom: finalizedMarkerDenom, NetAssetValues: []types.NetAssetValue{}, Administrator: authUser.String()},
expErr: "can only add net asset values to markers in the Proposed status: invalid request",
},
{
name: "nav denom matches marker denom",
msg: types.MsgAddNetAssetValueRequest{
Denom: markerDenom,
NetAssetValues: []types.NetAssetValue{
{
Value: sdk.NewInt64Coin(markerDenom, 100),
Volume: uint64(100),
Source: "exchange",
UpdateTime: s.blockStartTime,
},
},
Administrator: authUser.String(),
},
expErr: `net asset value denom cannot match marker denom "jackthecat": invalid request`,
},
{
name: "value denom does not exist",
msg: types.MsgAddNetAssetValueRequest{
Denom: markerDenom,
NetAssetValues: []types.NetAssetValue{
{
Value: sdk.NewInt64Coin("hotdog", 100),
Volume: uint64(100),
Source: "exchange",
UpdateTime: s.blockStartTime,
},
},
Administrator: authUser.String(),
},
expErr: `net asset value denom does not exist: marker hotdog not found for address: cosmos1p6l3annxy35gm5mfm6m0jz2mdj8peheuzf9alh: invalid request`,
},
{
name: "time is in the future of current block",
msg: types.MsgAddNetAssetValueRequest{
Denom: markerDenom,
NetAssetValues: []types.NetAssetValue{
{
Value: sdk.NewInt64Coin(valueDenom, 100),
Volume: uint64(100),
Source: "exchange",
UpdateTime: s.blockStartTime.Add(10 * time.Hour),
},
},
Administrator: authUser.String(),
},
expErr: fmt.Sprintf("net asset value update time (%v) is later than current block time (%v): invalid request", s.blockStartTime.Add(10*time.Hour).UTC(), s.blockStartTime.UTC()),
},
{
name: "successfully set nav",
msg: types.MsgAddNetAssetValueRequest{
Denom: markerDenom,
NetAssetValues: []types.NetAssetValue{
{
Value: sdk.NewInt64Coin(valueDenom, 100),
Volume: uint64(100),
Source: "exchange",
UpdateTime: s.blockStartTime.UTC(),
},
},
Administrator: authUser.String(),
},
},
}

for _, tc := range testCases {
s.Run(tc.name, func() {
res, err := s.msgServer.AddNetAssetValue(sdk.WrapSDKContext(s.ctx),
&tc.msg)

if len(tc.expErr) > 0 {
s.Assert().Nil(res)
s.Assert().EqualError(err, tc.expErr)

} else {
s.Assert().NoError(err)
s.Assert().Equal(res, &types.MsgAddNetAssetValueResponse{})
}
})
}
}

0 comments on commit 0ad7b47

Please sign in to comment.