github.com/KiraCore/sekai@v0.3.43/x/gov/handler_test.go (about)

     1  package gov_test
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"testing"
     7  	"time"
     8  
     9  	simapp "github.com/KiraCore/sekai/app"
    10  	appparams "github.com/KiraCore/sekai/app/params"
    11  	kiratypes "github.com/KiraCore/sekai/types"
    12  	"github.com/KiraCore/sekai/x/gov"
    13  	"github.com/KiraCore/sekai/x/gov/types"
    14  	tokenstypes "github.com/KiraCore/sekai/x/tokens/types"
    15  	tmproto "github.com/cometbft/cometbft/proto/tendermint/types"
    16  	sdk "github.com/cosmos/cosmos-sdk/types"
    17  	"github.com/cosmos/cosmos-sdk/types/errors"
    18  	"github.com/gogo/protobuf/proto"
    19  	"github.com/stretchr/testify/require"
    20  )
    21  
    22  func TestMain(m *testing.M) {
    23  	appparams.SetConfig()
    24  	os.Exit(m.Run())
    25  }
    26  
    27  // When a network actor has not been saved before, it creates one with default params
    28  // and sets the permissions.
    29  func TestHandler_MsgWhitelistPermissions_ActorDoesNotExist(t *testing.T) {
    30  	proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f")
    31  	require.NoError(t, err)
    32  
    33  	addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d")
    34  	require.NoError(t, err)
    35  
    36  	tests := []struct {
    37  		name             string
    38  		msg              sdk.Msg
    39  		checkWhitelisted bool
    40  	}{
    41  		{
    42  			"Msg Whitelist Permissions",
    43  			&types.MsgWhitelistPermissions{
    44  				Proposer:   proposerAddr,
    45  				Address:    addr,
    46  				Permission: uint32(types.PermClaimValidator),
    47  			},
    48  			true,
    49  		},
    50  		{
    51  			"Msg Blacklist Permissions",
    52  			&types.MsgBlacklistPermissions{
    53  				Proposer:   proposerAddr,
    54  				Address:    addr,
    55  				Permission: uint32(types.PermClaimValidator),
    56  			},
    57  			false,
    58  		},
    59  	}
    60  
    61  	for _, tt := range tests {
    62  		tt := tt
    63  		t.Run(tt.name, func(t *testing.T) {
    64  			app := simapp.Setup(false)
    65  			ctx := app.NewContext(false, tmproto.Header{})
    66  
    67  			err := setPermissionToAddr(t, app, ctx, proposerAddr, types.PermSetPermissions)
    68  			require.NoError(t, err)
    69  
    70  			handler := gov.NewHandler(app.CustomGovKeeper)
    71  			_, err = handler(ctx, tt.msg)
    72  			require.NoError(t, err)
    73  
    74  			actor, found := app.CustomGovKeeper.GetNetworkActorByAddress(ctx, addr)
    75  			require.True(t, found)
    76  
    77  			if tt.checkWhitelisted {
    78  				require.True(t, actor.Permissions.IsWhitelisted(types.PermClaimValidator))
    79  			} else {
    80  				require.True(t, actor.Permissions.IsBlacklisted(types.PermClaimValidator))
    81  			}
    82  		})
    83  	}
    84  }
    85  
    86  // When a network actor has already permissions it just appends the permission.
    87  func TestNewHandler_SetPermissions_ActorWithPerms(t *testing.T) {
    88  	addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d")
    89  	require.NoError(t, err)
    90  
    91  	proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f")
    92  	require.NoError(t, err)
    93  
    94  	tests := []struct {
    95  		name             string
    96  		msg              sdk.Msg
    97  		checkWhitelisted bool
    98  	}{
    99  		{
   100  			name: "actor with Whitelist Permissions",
   101  			msg: &types.MsgWhitelistPermissions{
   102  				Proposer:   proposerAddr,
   103  				Address:    addr,
   104  				Permission: uint32(types.PermClaimValidator),
   105  			},
   106  			checkWhitelisted: true,
   107  		},
   108  		{
   109  			name: "actor with Blacklist Permissions",
   110  			msg: &types.MsgBlacklistPermissions{
   111  				Proposer:   proposerAddr,
   112  				Address:    addr,
   113  				Permission: uint32(types.PermClaimValidator),
   114  			},
   115  			checkWhitelisted: false,
   116  		},
   117  	}
   118  
   119  	for _, tt := range tests {
   120  		tt := tt
   121  		t.Run(tt.name, func(t *testing.T) {
   122  			app := simapp.Setup(false)
   123  			ctx := app.NewContext(false, tmproto.Header{})
   124  
   125  			err := setPermissionToAddr(t, app, ctx, proposerAddr, types.PermSetPermissions)
   126  			require.NoError(t, err)
   127  
   128  			// Add some perms before to the actor.
   129  			actor := types.NewDefaultActor(addr)
   130  			if tt.checkWhitelisted {
   131  				err = actor.Permissions.AddToWhitelist(types.PermSetPermissions)
   132  			} else {
   133  				err = actor.Permissions.AddToBlacklist(types.PermSetPermissions)
   134  			}
   135  			require.NoError(t, err)
   136  
   137  			app.CustomGovKeeper.SaveNetworkActor(ctx, actor)
   138  
   139  			// Call the handler to add some permissions.
   140  			handler := gov.NewHandler(app.CustomGovKeeper)
   141  			_, err = handler(ctx, tt.msg)
   142  			require.NoError(t, err)
   143  
   144  			actor, found := app.CustomGovKeeper.GetNetworkActorByAddress(ctx, addr)
   145  			require.True(t, found)
   146  
   147  			if tt.checkWhitelisted {
   148  				require.True(t, actor.Permissions.IsWhitelisted(types.PermClaimValidator))
   149  				require.True(t, actor.Permissions.IsWhitelisted(types.PermSetPermissions)) // This permission was already set before callid add permission.
   150  			} else {
   151  				require.True(t, actor.Permissions.IsBlacklisted(types.PermClaimValidator))
   152  				require.True(t, actor.Permissions.IsBlacklisted(types.PermSetPermissions)) // This permission was already set before callid add permission.
   153  			}
   154  		})
   155  	}
   156  }
   157  
   158  func TestNewHandler_SetPermissionsWithoutSetPermissions(t *testing.T) {
   159  	addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d")
   160  	require.NoError(t, err)
   161  
   162  	proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f")
   163  	require.NoError(t, err)
   164  
   165  	tests := []struct {
   166  		name string
   167  		msg  sdk.Msg
   168  	}{
   169  		{
   170  			name: "MsgWhitelist",
   171  			msg: &types.MsgWhitelistPermissions{
   172  				Proposer:   proposerAddr,
   173  				Address:    addr,
   174  				Permission: uint32(types.PermClaimValidator),
   175  			},
   176  		},
   177  		{
   178  			name: "MsgBlacklist",
   179  			msg: &types.MsgBlacklistPermissions{
   180  				Proposer:   proposerAddr,
   181  				Address:    addr,
   182  				Permission: uint32(types.PermClaimValidator),
   183  			},
   184  		},
   185  	}
   186  
   187  	for _, tt := range tests {
   188  		tt := tt
   189  		t.Run(tt.name, func(t *testing.T) {
   190  			app := simapp.Setup(false)
   191  			ctx := app.NewContext(false, tmproto.Header{})
   192  
   193  			handler := gov.NewHandler(app.CustomGovKeeper)
   194  			_, err = handler(ctx, tt.msg)
   195  			require.EqualError(t, err, "PermSetPermissions || (ClaimValidatorPermission && ClaimValidatorPermMsg): not enough permissions")
   196  		})
   197  	}
   198  }
   199  
   200  func TestNewHandler_SetPermissions_ProposerHasRoleSudo(t *testing.T) {
   201  	addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d")
   202  	require.NoError(t, err)
   203  
   204  	proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f")
   205  	require.NoError(t, err)
   206  
   207  	tests := []struct {
   208  		name           string
   209  		msg            sdk.Msg
   210  		checkWhitelist bool
   211  	}{
   212  		{
   213  			name: "MsgWhitelist",
   214  			msg: &types.MsgWhitelistPermissions{
   215  				Proposer:   proposerAddr,
   216  				Address:    addr,
   217  				Permission: uint32(types.PermClaimValidator),
   218  			},
   219  			checkWhitelist: true,
   220  		},
   221  		{
   222  			name: "MsgBlacklist",
   223  			msg: &types.MsgBlacklistPermissions{
   224  				Proposer:   proposerAddr,
   225  				Address:    addr,
   226  				Permission: uint32(types.PermClaimValidator),
   227  			},
   228  			checkWhitelist: false,
   229  		},
   230  	}
   231  
   232  	for _, tt := range tests {
   233  		tt := tt
   234  		t.Run(tt.name, func(t *testing.T) {
   235  			app := simapp.Setup(false)
   236  			ctx := app.NewContext(false, tmproto.Header{})
   237  
   238  			// First we set Role Sudo to proposer Actor
   239  			proposerActor := types.NewDefaultActor(proposerAddr)
   240  			proposerActor.SetRole(types.RoleSudo)
   241  			require.NoError(t, err)
   242  			app.CustomGovKeeper.SaveNetworkActor(ctx, proposerActor)
   243  
   244  			handler := gov.NewHandler(app.CustomGovKeeper)
   245  			_, err = handler(ctx, tt.msg)
   246  			require.NoError(t, err)
   247  
   248  			actor, found := app.CustomGovKeeper.GetNetworkActorByAddress(ctx, addr)
   249  			require.True(t, found)
   250  
   251  			if tt.checkWhitelist {
   252  				require.True(t, actor.Permissions.IsWhitelisted(types.PermClaimValidator))
   253  			} else {
   254  				require.True(t, actor.Permissions.IsBlacklisted(types.PermClaimValidator))
   255  			}
   256  		})
   257  	}
   258  }
   259  
   260  func TestNewHandler_SetNetworkProperties(t *testing.T) {
   261  	changeFeeAddr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d")
   262  	require.NoError(t, err)
   263  
   264  	sudoAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f")
   265  	require.NoError(t, err)
   266  
   267  	tests := []struct {
   268  		name       string
   269  		msg        sdk.Msg
   270  		desiredErr string
   271  	}{
   272  		{
   273  			name: "Success run with ChangeTxFee permission",
   274  			msg: &types.MsgSetNetworkProperties{
   275  				NetworkProperties: &types.NetworkProperties{
   276  					MinTxFee: 100,
   277  					MaxTxFee: 1000,
   278  				},
   279  				Proposer: changeFeeAddr,
   280  			},
   281  			desiredErr: "",
   282  		},
   283  		{
   284  			name: "Failure run without ChangeTxFee permission",
   285  			msg: &types.MsgSetNetworkProperties{
   286  				NetworkProperties: &types.NetworkProperties{
   287  					MinTxFee: 100,
   288  					MaxTxFee: 1000,
   289  				},
   290  				Proposer: sudoAddr,
   291  			},
   292  			desiredErr: "not enough permissions",
   293  		},
   294  	}
   295  
   296  	for _, tt := range tests {
   297  		tt := tt
   298  		t.Run(tt.name, func(t *testing.T) {
   299  			app := simapp.Setup(false)
   300  			ctx := app.NewContext(false, tmproto.Header{})
   301  			// First we set Role Sudo to proposer Actor
   302  			proposerActor := types.NewDefaultActor(sudoAddr)
   303  			proposerActor.SetRole(types.RoleSudo)
   304  			app.CustomGovKeeper.SaveNetworkActor(ctx, proposerActor)
   305  
   306  			handler := gov.NewHandler(app.CustomGovKeeper)
   307  
   308  			// set change fee permission to addr
   309  			_, err = handler(ctx, &types.MsgWhitelistPermissions{
   310  				Proposer:   sudoAddr,
   311  				Address:    changeFeeAddr,
   312  				Permission: uint32(types.PermChangeTxFee),
   313  			})
   314  			require.NoError(t, err)
   315  
   316  			_, err = handler(ctx, tt.msg)
   317  			if tt.desiredErr == "" {
   318  				require.NoError(t, err)
   319  			} else {
   320  				require.Error(t, err)
   321  				require.Contains(t, err.Error(), tt.desiredErr)
   322  			}
   323  		})
   324  	}
   325  }
   326  
   327  func TestNewHandler_SetExecutionFee(t *testing.T) {
   328  	execFeeSetAddr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d")
   329  	require.NoError(t, err)
   330  
   331  	sudoAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f")
   332  	require.NoError(t, err)
   333  
   334  	tests := []struct {
   335  		name       string
   336  		msg        types.MsgSetExecutionFee
   337  		desiredErr string
   338  	}{
   339  		{
   340  			name: "Success run with ChangeTxFee permission",
   341  			msg: types.MsgSetExecutionFee{
   342  				TransactionType:   "network-properties",
   343  				ExecutionFee:      10000,
   344  				FailureFee:        1000,
   345  				Timeout:           1,
   346  				DefaultParameters: 2,
   347  				Proposer:          execFeeSetAddr,
   348  			},
   349  			desiredErr: "",
   350  		},
   351  		{
   352  			name: "Success run without ChangeTxFee permission",
   353  			msg: types.MsgSetExecutionFee{
   354  				TransactionType:   "network-properties-2",
   355  				ExecutionFee:      10000,
   356  				FailureFee:        1000,
   357  				Timeout:           1,
   358  				DefaultParameters: 2,
   359  				Proposer:          sudoAddr,
   360  			},
   361  			desiredErr: "PermChangeTxFee: not enough permissions",
   362  		},
   363  	}
   364  
   365  	for _, tt := range tests {
   366  		tt := tt
   367  		t.Run(tt.name, func(t *testing.T) {
   368  			app := simapp.Setup(false)
   369  			ctx := app.NewContext(false, tmproto.Header{})
   370  			// First we set Role Sudo to proposer Actor
   371  			proposerActor := types.NewDefaultActor(sudoAddr)
   372  			proposerActor.SetRole(types.RoleSudo)
   373  			require.NoError(t, err)
   374  			app.CustomGovKeeper.SaveNetworkActor(ctx, proposerActor)
   375  
   376  			handler := gov.NewHandler(app.CustomGovKeeper)
   377  
   378  			// set change fee permission to addr
   379  			_, err = handler(ctx, &types.MsgWhitelistPermissions{
   380  				Proposer:   sudoAddr,
   381  				Address:    execFeeSetAddr,
   382  				Permission: uint32(types.PermChangeTxFee),
   383  			})
   384  			require.NoError(t, err)
   385  
   386  			_, err = handler(ctx, &tt.msg)
   387  			if tt.desiredErr == "" {
   388  				require.NoError(t, err)
   389  				execFee := app.CustomGovKeeper.GetExecutionFee(ctx, tt.msg.TransactionType)
   390  				require.Equal(t, tt.msg.TransactionType, execFee.TransactionType)
   391  				require.Equal(t, tt.msg.ExecutionFee, execFee.ExecutionFee)
   392  				require.Equal(t, tt.msg.FailureFee, execFee.FailureFee)
   393  				require.Equal(t, tt.msg.Timeout, execFee.Timeout)
   394  				require.Equal(t, tt.msg.DefaultParameters, execFee.DefaultParameters)
   395  			} else {
   396  				require.Error(t, err)
   397  				require.Contains(t, err.Error(), tt.desiredErr)
   398  			}
   399  		})
   400  	}
   401  }
   402  
   403  func TestHandler_ClaimCouncilor_Fails(t *testing.T) {
   404  	addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d")
   405  	require.NoError(t, err)
   406  
   407  	tests := []struct {
   408  		name        string
   409  		msg         sdk.Msg
   410  		expectedErr error
   411  	}{
   412  		{
   413  			name: "not enough permissions",
   414  			msg: &types.MsgClaimCouncilor{
   415  				Moniker: "",
   416  				Address: addr,
   417  			},
   418  			expectedErr: fmt.Errorf("PermClaimCouncilor: not enough permissions"),
   419  		},
   420  	}
   421  
   422  	for _, tt := range tests {
   423  		tt := tt
   424  		t.Run(tt.name, func(t *testing.T) {
   425  			app := simapp.Setup(false)
   426  			ctx := app.NewContext(false, tmproto.Header{})
   427  
   428  			handler := gov.NewHandler(app.CustomGovKeeper)
   429  			_, err := handler(ctx, tt.msg)
   430  			require.EqualError(t, err, tt.expectedErr.Error())
   431  		})
   432  	}
   433  }
   434  
   435  func TestHandler_ClaimCouncilor_HappyPath(t *testing.T) {
   436  	addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d")
   437  	require.NoError(t, err)
   438  
   439  	tests := []struct {
   440  		name string
   441  		msg  *types.MsgClaimCouncilor
   442  	}{
   443  		{
   444  			name: "all correct",
   445  			msg: &types.MsgClaimCouncilor{
   446  				Address: addr,
   447  			},
   448  		},
   449  	}
   450  
   451  	for _, tt := range tests {
   452  		tt := tt
   453  		t.Run(tt.name, func(t *testing.T) {
   454  			app := simapp.Setup(false)
   455  			ctx := app.NewContext(false, tmproto.Header{})
   456  
   457  			err = setPermissionToAddr(t, app, ctx, addr, types.PermClaimCouncilor)
   458  			require.NoError(t, err)
   459  
   460  			handler := gov.NewHandler(app.CustomGovKeeper)
   461  			_, err := handler(ctx, tt.msg)
   462  			require.NoError(t, err)
   463  
   464  			expectedCouncilor := types.NewCouncilor(
   465  				tt.msg.Address,
   466  				types.CouncilorActive,
   467  			)
   468  
   469  			councilor, found := app.CustomGovKeeper.GetCouncilor(ctx, addr)
   470  			require.True(t, found)
   471  
   472  			require.Equal(t, expectedCouncilor, councilor)
   473  		})
   474  	}
   475  }
   476  
   477  func TestHandler_WhitelistRolePermissions_Errors(t *testing.T) {
   478  	addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d")
   479  	require.NoError(t, err)
   480  
   481  	tests := []struct {
   482  		name         string
   483  		msg          *types.MsgWhitelistRolePermission
   484  		preparePerms func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context)
   485  		expectedErr  error
   486  	}{
   487  		{
   488  			name: "address without SetPermissions perm",
   489  			msg: types.NewMsgWhitelistRolePermission(
   490  				addr,
   491  				fmt.Sprintf("%d", types.RoleValidator),
   492  				uint32(types.PermSetPermissions),
   493  			),
   494  			preparePerms: func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {
   495  				return
   496  			},
   497  			expectedErr: fmt.Errorf("%s: not enough permissions", types.PermUpsertRole.String()),
   498  		},
   499  		{
   500  			name: "role does not exist",
   501  			msg: types.NewMsgWhitelistRolePermission(
   502  				addr,
   503  				"10000",
   504  				1,
   505  			),
   506  			preparePerms: func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {
   507  				err2 := setPermissionToAddr(t, app, ctx, addr, types.PermUpsertRole)
   508  				require.NoError(t, err2)
   509  			},
   510  			expectedErr: fmt.Errorf("role does not exist"),
   511  		},
   512  		{
   513  			name: "permission is blacklisted",
   514  			msg: types.NewMsgWhitelistRolePermission(
   515  				addr,
   516  				fmt.Sprintf("%d", types.RoleValidator),
   517  				uint32(types.PermSetPermissions),
   518  			),
   519  			preparePerms: func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {
   520  				err2 := setPermissionToAddr(t, app, ctx, addr, types.PermUpsertRole)
   521  				require.NoError(t, err2)
   522  
   523  				_, found := app.CustomGovKeeper.GetPermissionsForRole(ctx, types.RoleValidator)
   524  				require.True(t, found)
   525  
   526  				err2 = app.CustomGovKeeper.BlacklistRolePermission(ctx, types.RoleValidator, types.PermSetPermissions)
   527  				require.NoError(t, err2)
   528  			},
   529  			expectedErr: fmt.Errorf("permission is blacklisted"),
   530  		},
   531  	}
   532  
   533  	for _, tt := range tests {
   534  		tt := tt
   535  		t.Run(tt.name, func(t *testing.T) {
   536  			app := simapp.Setup(false)
   537  			ctx := app.NewContext(false, tmproto.Header{})
   538  
   539  			tt.preparePerms(t, app, ctx)
   540  
   541  			handler := gov.NewHandler(app.CustomGovKeeper)
   542  			_, err := handler(ctx, tt.msg)
   543  			require.EqualError(t, err, tt.expectedErr.Error())
   544  		})
   545  	}
   546  }
   547  
   548  func TestHandler_WhitelistRolePermissions(t *testing.T) {
   549  	addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d")
   550  	require.NoError(t, err)
   551  
   552  	app := simapp.Setup(false)
   553  	ctx := app.NewContext(false, tmproto.Header{})
   554  
   555  	err = setPermissionToAddr(t, app, ctx, addr, types.PermUpsertRole)
   556  	require.NoError(t, err)
   557  
   558  	perms, found := app.CustomGovKeeper.GetPermissionsForRole(ctx, types.RoleValidator)
   559  	require.True(t, found)
   560  	require.False(t, perms.IsWhitelisted(types.PermSetPermissions))
   561  
   562  	msg := types.NewMsgWhitelistRolePermission(
   563  		addr,
   564  		fmt.Sprintf("%d", types.RoleValidator),
   565  		uint32(types.PermSetPermissions),
   566  	)
   567  
   568  	handler := gov.NewHandler(app.CustomGovKeeper)
   569  	_, err = handler(ctx, msg)
   570  	require.NoError(t, err)
   571  
   572  	perms, found = app.CustomGovKeeper.GetPermissionsForRole(ctx, types.RoleValidator)
   573  	require.True(t, found)
   574  	require.True(t, perms.IsWhitelisted(types.PermSetPermissions))
   575  }
   576  
   577  func TestHandler_BlacklistRolePermissions_Errors(t *testing.T) {
   578  	addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d")
   579  	require.NoError(t, err)
   580  
   581  	tests := []struct {
   582  		name         string
   583  		msg          *types.MsgBlacklistRolePermission
   584  		preparePerms func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context)
   585  		expectedErr  error
   586  	}{
   587  		{
   588  			name: "address without SetPermissions perm",
   589  			msg: types.NewMsgBlacklistRolePermission(
   590  				addr,
   591  				fmt.Sprintf("%d", types.RoleValidator),
   592  				uint32(types.PermSetPermissions),
   593  			),
   594  			preparePerms: func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {},
   595  			expectedErr:  fmt.Errorf("%s: not enough permissions", types.PermUpsertRole.String()),
   596  		},
   597  		{
   598  			name: "role does not exist",
   599  			msg: types.NewMsgBlacklistRolePermission(
   600  				addr,
   601  				"10000",
   602  				1,
   603  			),
   604  			preparePerms: func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {
   605  				err2 := setPermissionToAddr(t, app, ctx, addr, types.PermUpsertRole)
   606  				require.NoError(t, err2)
   607  			},
   608  			expectedErr: fmt.Errorf("role does not exist"),
   609  		},
   610  		{
   611  			name: "permission is whitelisted",
   612  			msg: types.NewMsgBlacklistRolePermission(
   613  				addr,
   614  				fmt.Sprintf("%d", types.RoleValidator),
   615  				uint32(types.PermSetPermissions),
   616  			),
   617  			preparePerms: func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {
   618  				err2 := setPermissionToAddr(t, app, ctx, addr, types.PermUpsertRole)
   619  				require.NoError(t, err2)
   620  
   621  				_, found := app.CustomGovKeeper.GetPermissionsForRole(ctx, types.RoleValidator)
   622  				require.True(t, found)
   623  
   624  				err2 = app.CustomGovKeeper.WhitelistRolePermission(ctx, types.RoleValidator, types.PermSetPermissions)
   625  				require.NoError(t, err2)
   626  			},
   627  			expectedErr: fmt.Errorf("permission is whitelisted"),
   628  		},
   629  	}
   630  
   631  	for _, tt := range tests {
   632  		tt := tt
   633  		t.Run(tt.name, func(t *testing.T) {
   634  			app := simapp.Setup(false)
   635  			ctx := app.NewContext(false, tmproto.Header{})
   636  
   637  			tt.preparePerms(t, app, ctx)
   638  
   639  			handler := gov.NewHandler(app.CustomGovKeeper)
   640  			_, err := handler(ctx, tt.msg)
   641  			require.EqualError(t, err, tt.expectedErr.Error())
   642  		})
   643  	}
   644  }
   645  
   646  func TestHandler_BlacklistRolePermissions(t *testing.T) {
   647  	addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d")
   648  	require.NoError(t, err)
   649  
   650  	app := simapp.Setup(false)
   651  	ctx := app.NewContext(false, tmproto.Header{})
   652  
   653  	err = setPermissionToAddr(t, app, ctx, addr, types.PermUpsertRole)
   654  	require.NoError(t, err)
   655  
   656  	perms, found := app.CustomGovKeeper.GetPermissionsForRole(ctx, types.RoleValidator)
   657  	require.True(t, found)
   658  	require.False(t, perms.IsBlacklisted(types.PermSetPermissions))
   659  
   660  	msg := types.NewMsgBlacklistRolePermission(
   661  		addr,
   662  		fmt.Sprintf("%d", types.RoleValidator),
   663  		uint32(types.PermSetPermissions),
   664  	)
   665  
   666  	handler := gov.NewHandler(app.CustomGovKeeper)
   667  	_, err = handler(ctx, msg)
   668  	require.NoError(t, err)
   669  
   670  	perms, found = app.CustomGovKeeper.GetPermissionsForRole(ctx, types.RoleValidator)
   671  	require.True(t, found)
   672  	require.True(t, perms.IsBlacklisted(types.PermSetPermissions))
   673  }
   674  
   675  func TestHandler_RemoveWhitelistRolePermissions_Errors(t *testing.T) {
   676  	addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d")
   677  	require.NoError(t, err)
   678  
   679  	tests := []struct {
   680  		name         string
   681  		msg          *types.MsgRemoveWhitelistRolePermission
   682  		preparePerms func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context)
   683  		expectedErr  error
   684  	}{
   685  		{
   686  			name: "address without SetPermissions perm",
   687  			msg: types.NewMsgRemoveWhitelistRolePermission(
   688  				addr,
   689  				fmt.Sprintf("%d", types.RoleValidator),
   690  				uint32(types.PermSetPermissions),
   691  			),
   692  			preparePerms: func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {},
   693  			expectedErr:  fmt.Errorf("%s: not enough permissions", types.PermUpsertRole.String()),
   694  		},
   695  		{
   696  			name: "role does not exist",
   697  			msg: types.NewMsgRemoveWhitelistRolePermission(
   698  				addr,
   699  				"10000",
   700  				1,
   701  			),
   702  			preparePerms: func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {
   703  				err2 := setPermissionToAddr(t, app, ctx, addr, types.PermUpsertRole)
   704  				require.NoError(t, err2)
   705  			},
   706  			expectedErr: fmt.Errorf("role does not exist"),
   707  		},
   708  	}
   709  
   710  	for _, tt := range tests {
   711  		tt := tt
   712  		t.Run(tt.name, func(t *testing.T) {
   713  			app := simapp.Setup(false)
   714  			ctx := app.NewContext(false, tmproto.Header{})
   715  
   716  			tt.preparePerms(t, app, ctx)
   717  
   718  			handler := gov.NewHandler(app.CustomGovKeeper)
   719  			_, err := handler(ctx, tt.msg)
   720  			require.EqualError(t, err, tt.expectedErr.Error())
   721  		})
   722  	}
   723  }
   724  
   725  func TestHandler_RemoveWhitelistRolePermissions(t *testing.T) {
   726  	addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d")
   727  	require.NoError(t, err)
   728  
   729  	app := simapp.Setup(false)
   730  	ctx := app.NewContext(false, tmproto.Header{})
   731  
   732  	err = setPermissionToAddr(t, app, ctx, addr, types.PermUpsertRole)
   733  	require.NoError(t, err)
   734  
   735  	perms, found := app.CustomGovKeeper.GetPermissionsForRole(ctx, types.RoleValidator)
   736  	require.True(t, found)
   737  	require.True(t, perms.IsWhitelisted(types.PermClaimValidator))
   738  
   739  	msg := types.NewMsgRemoveWhitelistRolePermission(
   740  		addr,
   741  		fmt.Sprintf("%d", types.RoleValidator),
   742  		uint32(types.PermClaimValidator),
   743  	)
   744  
   745  	handler := gov.NewHandler(app.CustomGovKeeper)
   746  	_, err = handler(ctx, msg)
   747  	require.NoError(t, err)
   748  
   749  	perms, found = app.CustomGovKeeper.GetPermissionsForRole(ctx, types.RoleValidator)
   750  	require.True(t, found)
   751  	require.False(t, perms.IsWhitelisted(types.PermClaimValidator))
   752  }
   753  
   754  func TestHandler_RemoveBlacklistRolePermissions_Errors(t *testing.T) {
   755  	addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d")
   756  	require.NoError(t, err)
   757  
   758  	tests := []struct {
   759  		name         string
   760  		msg          *types.MsgRemoveBlacklistRolePermission
   761  		preparePerms func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context)
   762  		expectedErr  error
   763  	}{
   764  		{
   765  			name: "address without SetPermissions perm",
   766  			msg: types.NewMsgRemoveBlacklistRolePermission(
   767  				addr,
   768  				fmt.Sprintf("%d", types.RoleValidator),
   769  				uint32(types.PermSetPermissions),
   770  			),
   771  			preparePerms: func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {},
   772  			expectedErr:  fmt.Errorf("%s: not enough permissions", types.PermUpsertRole.String()),
   773  		},
   774  		{
   775  			name: "role does not exist",
   776  			msg: types.NewMsgRemoveBlacklistRolePermission(
   777  				addr,
   778  				"10000",
   779  				1,
   780  			),
   781  			preparePerms: func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {
   782  				err2 := setPermissionToAddr(t, app, ctx, addr, types.PermUpsertRole)
   783  				require.NoError(t, err2)
   784  			},
   785  			expectedErr: fmt.Errorf("role does not exist"),
   786  		},
   787  	}
   788  
   789  	for _, tt := range tests {
   790  		tt := tt
   791  		t.Run(tt.name, func(t *testing.T) {
   792  			app := simapp.Setup(false)
   793  			ctx := app.NewContext(false, tmproto.Header{})
   794  
   795  			tt.preparePerms(t, app, ctx)
   796  
   797  			handler := gov.NewHandler(app.CustomGovKeeper)
   798  			_, err := handler(ctx, tt.msg)
   799  			require.EqualError(t, err, tt.expectedErr.Error())
   800  		})
   801  	}
   802  }
   803  
   804  func TestHandler_RemoveBlacklistRolePermissions(t *testing.T) {
   805  	addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d")
   806  	require.NoError(t, err)
   807  
   808  	app := simapp.Setup(false)
   809  	ctx := app.NewContext(false, tmproto.Header{})
   810  
   811  	err = setPermissionToAddr(t, app, ctx, addr, types.PermUpsertRole)
   812  	require.NoError(t, err)
   813  
   814  	_, found := app.CustomGovKeeper.GetPermissionsForRole(ctx, types.RoleValidator)
   815  	require.True(t, found)
   816  
   817  	// Set some blacklist value
   818  	err = app.CustomGovKeeper.BlacklistRolePermission(ctx, types.RoleValidator, types.PermClaimCouncilor)
   819  	require.NoError(t, err)
   820  
   821  	// Check if it is blacklisted.
   822  	perms, found := app.CustomGovKeeper.GetPermissionsForRole(ctx, types.RoleValidator)
   823  	require.True(t, found)
   824  	require.True(t, perms.IsBlacklisted(types.PermClaimCouncilor))
   825  
   826  	msg := types.NewMsgRemoveBlacklistRolePermission(
   827  		addr,
   828  		fmt.Sprintf("%d", types.RoleValidator),
   829  		uint32(types.PermClaimCouncilor),
   830  	)
   831  
   832  	handler := gov.NewHandler(app.CustomGovKeeper)
   833  	_, err = handler(ctx, msg)
   834  	require.NoError(t, err)
   835  
   836  	perms, found = app.CustomGovKeeper.GetPermissionsForRole(ctx, types.RoleValidator)
   837  	require.True(t, found)
   838  	require.False(t, perms.IsBlacklisted(types.PermClaimCouncilor))
   839  }
   840  
   841  func TestHandler_CreateRole_Errors(t *testing.T) {
   842  	addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d")
   843  	require.NoError(t, err)
   844  
   845  	tests := []struct {
   846  		name         string
   847  		msg          *types.MsgCreateRole
   848  		preparePerms func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context)
   849  		expectedErr  error
   850  	}{
   851  		{
   852  			"fails when no perms",
   853  			types.NewMsgCreateRole(
   854  				addr,
   855  				"role10",
   856  				"role10desc",
   857  			),
   858  			func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {},
   859  			fmt.Errorf("PermUpsertRole: not enough permissions"),
   860  		},
   861  		{
   862  			"fails when role already exists",
   863  			types.NewMsgCreateRole(
   864  				addr,
   865  				"role1234",
   866  				"role1234desc",
   867  			),
   868  			func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {
   869  				err2 := setPermissionToAddr(t, app, ctx, addr, types.PermUpsertRole)
   870  				require.NoError(t, err2)
   871  				app.CustomGovKeeper.CreateRole(ctx, "role1234", "role1234desc")
   872  			},
   873  			fmt.Errorf("role already exist"),
   874  		},
   875  	}
   876  
   877  	for _, tt := range tests {
   878  		app := simapp.Setup(false)
   879  		ctx := app.NewContext(false, tmproto.Header{})
   880  
   881  		tt.preparePerms(t, app, ctx)
   882  
   883  		handler := gov.NewHandler(app.CustomGovKeeper)
   884  		_, err := handler(ctx, tt.msg)
   885  		require.EqualError(t, err, tt.expectedErr.Error())
   886  	}
   887  }
   888  
   889  func TestHandler_CreateRole(t *testing.T) {
   890  	addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d")
   891  	require.NoError(t, err)
   892  
   893  	app := simapp.Setup(false)
   894  	ctx := app.NewContext(false, tmproto.Header{})
   895  
   896  	err = setPermissionToAddr(t, app, ctx, addr, types.PermUpsertRole)
   897  	require.NoError(t, err)
   898  
   899  	_, found := app.CustomGovKeeper.GetPermissionsForRole(ctx, 1234)
   900  	require.False(t, found)
   901  
   902  	handler := gov.NewHandler(app.CustomGovKeeper)
   903  	_, err = handler(ctx, types.NewMsgCreateRole(
   904  		addr,
   905  		"role1234",
   906  		"role1234desc",
   907  	))
   908  	require.NoError(t, err)
   909  
   910  	_, err = app.CustomGovKeeper.GetRoleBySid(ctx, "role1234")
   911  	require.NoError(t, err)
   912  }
   913  
   914  func TestHandler_AssignRole_Errors(t *testing.T) {
   915  	proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f")
   916  	require.NoError(t, err)
   917  
   918  	addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d")
   919  	require.NoError(t, err)
   920  
   921  	tests := []struct {
   922  		name         string
   923  		msg          *types.MsgAssignRole
   924  		preparePerms func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context)
   925  		expectedErr  error
   926  	}{
   927  		{
   928  			"fails when no perms",
   929  			types.NewMsgAssignRole(
   930  				proposerAddr, addr, 3,
   931  			),
   932  			func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {},
   933  			fmt.Errorf("%s: not enough permissions", types.PermUpsertRole.String()),
   934  		},
   935  		{
   936  			"fails when role does not exist",
   937  			types.NewMsgAssignRole(
   938  				proposerAddr, addr, 3,
   939  			),
   940  			func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {
   941  				err2 := setPermissionToAddr(t, app, ctx, proposerAddr, types.PermUpsertRole)
   942  				require.NoError(t, err2)
   943  			},
   944  			types.ErrRoleDoesNotExist,
   945  		},
   946  		{
   947  			"role already assigned",
   948  			types.NewMsgAssignRole(
   949  				proposerAddr, addr, 3,
   950  			),
   951  			func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {
   952  				err2 := setPermissionToAddr(t, app, ctx, proposerAddr, types.PermUpsertRole)
   953  				require.NoError(t, err2)
   954  
   955  				app.CustomGovKeeper.SetRole(ctx, types.Role{
   956  					Id:          3,
   957  					Sid:         "3",
   958  					Description: "3",
   959  				})
   960  				err2 = app.CustomGovKeeper.WhitelistRolePermission(ctx, 3, types.PermClaimValidator)
   961  				require.NoError(t, err2)
   962  
   963  				networkActor := types.NewDefaultActor(addr)
   964  				app.CustomGovKeeper.AssignRoleToActor(ctx, networkActor, 3)
   965  			},
   966  			types.ErrRoleAlreadyAssigned,
   967  		},
   968  	}
   969  
   970  	for _, tt := range tests {
   971  		app := simapp.Setup(false)
   972  		ctx := app.NewContext(false, tmproto.Header{})
   973  
   974  		tt.preparePerms(t, app, ctx)
   975  
   976  		handler := gov.NewHandler(app.CustomGovKeeper)
   977  		_, err := handler(ctx, tt.msg)
   978  		require.EqualError(t, err, tt.expectedErr.Error())
   979  	}
   980  }
   981  
   982  func TestHandler_AssignRole(t *testing.T) {
   983  	proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f")
   984  	require.NoError(t, err)
   985  
   986  	addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d")
   987  	require.NoError(t, err)
   988  
   989  	app := simapp.Setup(false)
   990  	ctx := app.NewContext(false, tmproto.Header{})
   991  
   992  	// Set permissions to proposer.
   993  	err = setPermissionToAddr(t, app, ctx, proposerAddr, types.PermUpsertRole)
   994  	require.NoError(t, err)
   995  
   996  	// Create role
   997  	app.CustomGovKeeper.SetRole(ctx, types.Role{
   998  		Id:          3,
   999  		Sid:         "3",
  1000  		Description: "3",
  1001  	})
  1002  	err = app.CustomGovKeeper.WhitelistRolePermission(ctx, 3, types.PermSetPermissions)
  1003  	require.NoError(t, err)
  1004  
  1005  	msg := types.NewMsgAssignRole(proposerAddr, addr, 3)
  1006  
  1007  	handler := gov.NewHandler(app.CustomGovKeeper)
  1008  	_, err = handler(ctx, msg)
  1009  	require.NoError(t, err)
  1010  
  1011  	actor, found := app.CustomGovKeeper.GetNetworkActorByAddress(ctx, addr)
  1012  	require.True(t, found)
  1013  
  1014  	require.True(t, actor.HasRole(3))
  1015  }
  1016  
  1017  func TestHandler_UnassignRole_Errors(t *testing.T) {
  1018  	proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f")
  1019  	require.NoError(t, err)
  1020  
  1021  	addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d")
  1022  	require.NoError(t, err)
  1023  
  1024  	tests := []struct {
  1025  		name         string
  1026  		msg          *types.MsgUnassignRole
  1027  		preparePerms func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context)
  1028  		expectedErr  error
  1029  	}{
  1030  		{
  1031  			"fails when no perms",
  1032  			types.NewMsgUnassignRole(
  1033  				proposerAddr, addr, 3,
  1034  			),
  1035  			func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {},
  1036  			fmt.Errorf("%s: not enough permissions", types.PermUpsertRole.String()),
  1037  		},
  1038  		{
  1039  			"fails when role does not exist",
  1040  			types.NewMsgUnassignRole(
  1041  				proposerAddr, addr, 3,
  1042  			),
  1043  			func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {
  1044  				err2 := setPermissionToAddr(t, app, ctx, proposerAddr, types.PermUpsertRole)
  1045  				require.NoError(t, err2)
  1046  			},
  1047  			types.ErrRoleDoesNotExist,
  1048  		},
  1049  		{
  1050  			"role not assigned",
  1051  			types.NewMsgUnassignRole(
  1052  				proposerAddr, addr, 3,
  1053  			),
  1054  			func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {
  1055  				err2 := setPermissionToAddr(t, app, ctx, proposerAddr, types.PermUpsertRole)
  1056  				require.NoError(t, err2)
  1057  
  1058  				app.CustomGovKeeper.SetRole(ctx, types.Role{
  1059  					Id:          3,
  1060  					Sid:         "3",
  1061  					Description: "3",
  1062  				})
  1063  				err2 = app.CustomGovKeeper.WhitelistRolePermission(ctx, 3, types.PermClaimValidator)
  1064  				require.NoError(t, err2)
  1065  				networkActor := types.NewDefaultActor(addr)
  1066  				app.CustomGovKeeper.SaveNetworkActor(ctx, networkActor)
  1067  			},
  1068  			types.ErrRoleNotAssigned,
  1069  		},
  1070  	}
  1071  
  1072  	for _, tt := range tests {
  1073  		app := simapp.Setup(false)
  1074  		ctx := app.NewContext(false, tmproto.Header{})
  1075  
  1076  		tt.preparePerms(t, app, ctx)
  1077  
  1078  		handler := gov.NewHandler(app.CustomGovKeeper)
  1079  		_, err := handler(ctx, tt.msg)
  1080  		require.EqualError(t, err, tt.expectedErr.Error())
  1081  	}
  1082  }
  1083  
  1084  func TestHandler_UnassignRoles(t *testing.T) {
  1085  	proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f")
  1086  	require.NoError(t, err)
  1087  
  1088  	addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d")
  1089  	require.NoError(t, err)
  1090  
  1091  	app := simapp.Setup(false)
  1092  	ctx := app.NewContext(false, tmproto.Header{})
  1093  
  1094  	// Set permissions to proposer.
  1095  	err = setPermissionToAddr(t, app, ctx, proposerAddr, types.PermUpsertRole)
  1096  	require.NoError(t, err)
  1097  
  1098  	// Set new role and set permission to actor.
  1099  	app.CustomGovKeeper.SetRole(ctx, types.Role{
  1100  		Id:          3,
  1101  		Sid:         "3",
  1102  		Description: "3",
  1103  	})
  1104  	err = app.CustomGovKeeper.WhitelistRolePermission(ctx, 3, types.PermSetPermissions)
  1105  	require.NoError(t, err)
  1106  
  1107  	actor := types.NewDefaultActor(addr)
  1108  	app.CustomGovKeeper.AssignRoleToActor(ctx, actor, 3)
  1109  
  1110  	actor, found := app.CustomGovKeeper.GetNetworkActorByAddress(ctx, addr)
  1111  	require.True(t, found)
  1112  	require.True(t, actor.HasRole(3))
  1113  
  1114  	msg := types.NewMsgUnassignRole(proposerAddr, addr, 3)
  1115  	handler := gov.NewHandler(app.CustomGovKeeper)
  1116  	_, err = handler(ctx, msg)
  1117  	require.NoError(t, err)
  1118  
  1119  	actor, found = app.CustomGovKeeper.GetNetworkActorByAddress(ctx, addr)
  1120  	require.True(t, found)
  1121  
  1122  	require.False(t, actor.HasRole(3))
  1123  }
  1124  
  1125  func TestHandler_CreateProposalAssignPermission_Errors(t *testing.T) {
  1126  	proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f")
  1127  	require.NoError(t, err)
  1128  
  1129  	addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d")
  1130  	require.NoError(t, err)
  1131  
  1132  	tests := []struct {
  1133  		name         string
  1134  		content      types.Content
  1135  		preparePerms func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context)
  1136  		expectedErr  error
  1137  	}{
  1138  		{
  1139  			"Proposer does not have Perm",
  1140  			types.NewWhitelistAccountPermissionProposal(
  1141  				addr, types.PermClaimValidator,
  1142  			),
  1143  			func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {},
  1144  			errors.Wrap(types.ErrNotEnoughPermissions, types.PermWhitelistAccountPermissionProposal.String()),
  1145  		},
  1146  		{
  1147  			"address already has that permission",
  1148  			types.NewWhitelistAccountPermissionProposal(
  1149  				addr, types.PermClaimValidator,
  1150  			),
  1151  			func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {
  1152  				proposerActor := types.NewDefaultActor(proposerAddr)
  1153  				err2 := app.CustomGovKeeper.AddWhitelistPermission(ctx, proposerActor, types.PermWhitelistAccountPermissionProposal)
  1154  				require.NoError(t, err2)
  1155  
  1156  				actor := types.NewDefaultActor(addr)
  1157  				err2 = app.CustomGovKeeper.AddWhitelistPermission(ctx, actor, types.PermClaimValidator)
  1158  				require.NoError(t, err2)
  1159  			},
  1160  			fmt.Errorf("permission already whitelisted: error adding to whitelist"),
  1161  		},
  1162  	}
  1163  
  1164  	for _, tt := range tests {
  1165  		tt := tt
  1166  		t.Run(tt.name, func(t *testing.T) {
  1167  			app := simapp.Setup(false)
  1168  			ctx := app.NewContext(false, tmproto.Header{})
  1169  
  1170  			tt.preparePerms(t, app, ctx)
  1171  
  1172  			handler := gov.NewHandler(app.CustomGovKeeper)
  1173  			msg, err := types.NewMsgSubmitProposal(proposerAddr, "title", "some desc", tt.content)
  1174  			require.NoError(t, err)
  1175  			_, err = handler(ctx, msg)
  1176  			require.EqualError(t, err, tt.expectedErr.Error())
  1177  		})
  1178  	}
  1179  }
  1180  
  1181  func TestHandler_ProposalAssignPermission(t *testing.T) {
  1182  	proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f")
  1183  	require.NoError(t, err)
  1184  
  1185  	addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d")
  1186  	require.NoError(t, err)
  1187  
  1188  	app := simapp.Setup(false)
  1189  	ctx := app.NewContext(false, tmproto.Header{
  1190  		Time: time.Now(),
  1191  	})
  1192  
  1193  	// Set proposer Permissions
  1194  	proposerActor := types.NewDefaultActor(proposerAddr)
  1195  	err2 := app.CustomGovKeeper.AddWhitelistPermission(ctx, proposerActor, types.PermWhitelistAccountPermissionProposal)
  1196  	require.NoError(t, err2)
  1197  
  1198  	properties := app.CustomGovKeeper.GetNetworkProperties(ctx)
  1199  	properties.MinimumProposalEndTime = 600 // Seconds, 10 mins
  1200  	app.CustomGovKeeper.SetNetworkProperties(ctx, properties)
  1201  
  1202  	handler := gov.NewHandler(app.CustomGovKeeper)
  1203  	proposal := types.NewWhitelistAccountPermissionProposal(addr, types.PermValue(1))
  1204  	msg, err := types.NewMsgSubmitProposal(proposerAddr, "title", "some desc", proposal)
  1205  	require.NoError(t, err)
  1206  	res, err := handler(
  1207  		ctx,
  1208  		msg,
  1209  	)
  1210  	require.NoError(t, err)
  1211  
  1212  	expData, _ := proto.Marshal(&types.MsgSubmitProposalResponse{ProposalID: 1})
  1213  	require.Equal(t, expData, res.Data)
  1214  
  1215  	savedProposal, found := app.CustomGovKeeper.GetProposal(ctx, 1)
  1216  	require.True(t, found)
  1217  
  1218  	expectedSavedProposal, err := types.NewProposal(
  1219  		1,
  1220  		"title",
  1221  		"some desc",
  1222  		types.NewWhitelistAccountPermissionProposal(
  1223  			addr,
  1224  			types.PermValue(1),
  1225  		),
  1226  		ctx.BlockTime(),
  1227  		ctx.BlockTime().Add(time.Second*time.Duration(properties.MinimumProposalEndTime)),
  1228  		ctx.BlockTime().Add((time.Second*time.Duration(properties.MinimumProposalEndTime))+(time.Second*time.Duration(properties.ProposalEnactmentTime))),
  1229  		ctx.BlockHeight()+2,
  1230  		ctx.BlockHeight()+3,
  1231  	)
  1232  	require.NoError(t, err)
  1233  	require.Equal(t, expectedSavedProposal, savedProposal)
  1234  
  1235  	// Next proposal ID is increased.
  1236  	id := app.CustomGovKeeper.GetNextProposalID(ctx)
  1237  	require.Equal(t, uint64(2), id)
  1238  
  1239  	// Is not on finished active proposals.
  1240  	iterator := app.CustomGovKeeper.GetActiveProposalsWithFinishedVotingEndTimeIterator(ctx, ctx.BlockTime())
  1241  	require.False(t, iterator.Valid())
  1242  
  1243  	ctx = ctx.WithBlockTime(ctx.BlockTime().Add(time.Minute * 10))
  1244  	iterator = app.CustomGovKeeper.GetActiveProposalsWithFinishedVotingEndTimeIterator(ctx, ctx.BlockTime())
  1245  	require.True(t, iterator.Valid())
  1246  }
  1247  
  1248  func TestHandler_CreateProposalUpsertDataRegistry_Errors(t *testing.T) {
  1249  	proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f")
  1250  	require.NoError(t, err)
  1251  
  1252  	tests := []struct {
  1253  		name         string
  1254  		content      types.Content
  1255  		preparePerms func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context)
  1256  		expectedErr  error
  1257  	}{
  1258  		{
  1259  			"Proposer does not have Perm",
  1260  			types.NewUpsertDataRegistryProposal(
  1261  				"theKey",
  1262  				"theHash",
  1263  				"theReference",
  1264  				"theEncoding",
  1265  				1234,
  1266  			),
  1267  			func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {},
  1268  			errors.Wrap(types.ErrNotEnoughPermissions, types.PermCreateUpsertDataRegistryProposal.String()),
  1269  		},
  1270  	}
  1271  
  1272  	for _, tt := range tests {
  1273  		tt := tt
  1274  		t.Run(tt.name, func(t *testing.T) {
  1275  			app := simapp.Setup(false)
  1276  			ctx := app.NewContext(false, tmproto.Header{})
  1277  
  1278  			tt.preparePerms(t, app, ctx)
  1279  
  1280  			handler := gov.NewHandler(app.CustomGovKeeper)
  1281  			msg, err := types.NewMsgSubmitProposal(proposerAddr, "title", "some desc", tt.content)
  1282  			require.NoError(t, err)
  1283  			_, err = handler(ctx, msg)
  1284  			require.EqualError(t, err, tt.expectedErr.Error())
  1285  		})
  1286  	}
  1287  }
  1288  
  1289  func TestHandler_ProposalUpsertDataRegistry(t *testing.T) {
  1290  	proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f")
  1291  	require.NoError(t, err)
  1292  
  1293  	app := simapp.Setup(false)
  1294  	ctx := app.NewContext(false, tmproto.Header{
  1295  		Time: time.Now(),
  1296  	})
  1297  
  1298  	// Set proposer Permissions
  1299  	proposerActor := types.NewDefaultActor(proposerAddr)
  1300  	err2 := app.CustomGovKeeper.AddWhitelistPermission(ctx, proposerActor, types.PermCreateUpsertDataRegistryProposal)
  1301  	require.NoError(t, err2)
  1302  
  1303  	properties := app.CustomGovKeeper.GetNetworkProperties(ctx)
  1304  	properties.MinimumProposalEndTime = 10
  1305  	app.CustomGovKeeper.SetNetworkProperties(ctx, properties)
  1306  
  1307  	handler := gov.NewHandler(app.CustomGovKeeper)
  1308  	proposal := types.NewUpsertDataRegistryProposal(
  1309  		"theKey",
  1310  		"theHash",
  1311  		"theReference",
  1312  		"theEncoding",
  1313  		1234,
  1314  	)
  1315  	msg, err := types.NewMsgSubmitProposal(proposerAddr, "title", "some desc", proposal)
  1316  	require.NoError(t, err)
  1317  	res, err := handler(
  1318  		ctx, msg,
  1319  	)
  1320  	require.NoError(t, err)
  1321  
  1322  	expData, _ := proto.Marshal(&types.MsgSubmitProposalResponse{ProposalID: 1})
  1323  	require.Equal(t, expData, res.Data)
  1324  
  1325  	savedProposal, found := app.CustomGovKeeper.GetProposal(ctx, 1)
  1326  	require.True(t, found)
  1327  
  1328  	expectedSavedProposal, err := types.NewProposal(
  1329  		1,
  1330  		"title",
  1331  		"some desc",
  1332  		types.NewUpsertDataRegistryProposal(
  1333  			"theKey",
  1334  			"theHash",
  1335  			"theReference",
  1336  			"theEncoding",
  1337  			1234,
  1338  		),
  1339  		ctx.BlockTime(),
  1340  		ctx.BlockTime().Add(time.Second*time.Duration(properties.MinimumProposalEndTime)),
  1341  		ctx.BlockTime().Add(time.Second*time.Duration(properties.ProposalEnactmentTime)+time.Second*time.Duration(properties.MinimumProposalEndTime)),
  1342  		ctx.BlockHeight()+2,
  1343  		ctx.BlockHeight()+3,
  1344  	)
  1345  	require.NoError(t, err)
  1346  	require.Equal(t, expectedSavedProposal, savedProposal)
  1347  
  1348  	// Next proposal ID is increased.
  1349  	id := app.CustomGovKeeper.GetNextProposalID(ctx)
  1350  	require.Equal(t, uint64(2), id)
  1351  
  1352  	// Is not on finished active proposals.
  1353  	iterator := app.CustomGovKeeper.GetActiveProposalsWithFinishedVotingEndTimeIterator(ctx, ctx.BlockTime())
  1354  	require.False(t, iterator.Valid())
  1355  
  1356  	ctx = ctx.WithBlockTime(ctx.BlockTime().Add(time.Minute * 10))
  1357  	iterator = app.CustomGovKeeper.GetActiveProposalsWithFinishedVotingEndTimeIterator(ctx, ctx.BlockTime())
  1358  	require.True(t, iterator.Valid())
  1359  }
  1360  
  1361  func TestHandler_VoteProposal_Errors(t *testing.T) {
  1362  	voterAddr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d")
  1363  	require.NoError(t, err)
  1364  
  1365  	tests := []struct {
  1366  		name         string
  1367  		msg          *types.MsgVoteProposal
  1368  		preparePerms func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context)
  1369  		expectedErr  error
  1370  	}{
  1371  		{
  1372  			"voting time has finished",
  1373  			types.NewMsgVoteProposal(
  1374  				1, voterAddr, types.OptionAbstain, sdk.ZeroDec(),
  1375  			),
  1376  			func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {
  1377  				actor := types.NewNetworkActor(
  1378  					voterAddr,
  1379  					[]uint64{},
  1380  					types.Active,
  1381  					[]types.VoteOption{},
  1382  					types.NewPermissions(nil, nil),
  1383  					1,
  1384  				)
  1385  				app.CustomGovKeeper.SaveNetworkActor(ctx, actor)
  1386  
  1387  				err = app.CustomGovKeeper.AddWhitelistPermission(ctx, actor, types.PermVoteWhitelistAccountPermissionProposal)
  1388  				require.NoError(t, err)
  1389  
  1390  				// Create proposal
  1391  				proposal, err := types.NewProposal(
  1392  					1,
  1393  					"title",
  1394  					"some desc",
  1395  					types.NewWhitelistAccountPermissionProposal(
  1396  						voterAddr,
  1397  						types.PermClaimCouncilor,
  1398  					),
  1399  					ctx.BlockTime(),
  1400  					ctx.BlockTime().Add(time.Second*9),
  1401  					ctx.BlockTime().Add(time.Second*20),
  1402  					ctx.BlockHeight()+2,
  1403  					ctx.BlockHeight()+3,
  1404  				)
  1405  
  1406  				require.NoError(t, err)
  1407  				app.CustomGovKeeper.SaveProposal(ctx, proposal)
  1408  			},
  1409  			types.ErrVotingTimeEnded,
  1410  		},
  1411  		{
  1412  			"Voter does not have permission to vote this proposal: Assign Permission",
  1413  			types.NewMsgVoteProposal(
  1414  				1, voterAddr, types.OptionAbstain, sdk.ZeroDec(),
  1415  			),
  1416  			func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {
  1417  				actor := types.NewNetworkActor(
  1418  					voterAddr,
  1419  					[]uint64{},
  1420  					types.Active,
  1421  					[]types.VoteOption{},
  1422  					types.NewPermissions(nil, nil),
  1423  					1,
  1424  				)
  1425  				app.CustomGovKeeper.SaveNetworkActor(ctx, actor)
  1426  
  1427  				// Create proposal
  1428  				proposal, err := types.NewProposal(
  1429  					1,
  1430  					"title",
  1431  					"some desc",
  1432  					types.NewWhitelistAccountPermissionProposal(
  1433  						voterAddr,
  1434  						types.PermClaimCouncilor,
  1435  					),
  1436  					ctx.BlockTime(),
  1437  					ctx.BlockTime().Add(time.Second*20),
  1438  					ctx.BlockTime().Add(time.Second*30),
  1439  					ctx.BlockHeight()+2,
  1440  					ctx.BlockHeight()+3,
  1441  				)
  1442  				require.NoError(t, err)
  1443  				app.CustomGovKeeper.SaveProposal(ctx, proposal)
  1444  			},
  1445  			fmt.Errorf("%s: not enough permissions", types.PermVoteWhitelistAccountPermissionProposal.String()),
  1446  		},
  1447  		{
  1448  			"Voter does not have permission to vote this proposal: Change Data Registry",
  1449  			types.NewMsgVoteProposal(
  1450  				1, voterAddr, types.OptionAbstain, sdk.ZeroDec(),
  1451  			),
  1452  			func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {
  1453  				actor := types.NewNetworkActor(
  1454  					voterAddr,
  1455  					[]uint64{},
  1456  					types.Active,
  1457  					[]types.VoteOption{},
  1458  					types.NewPermissions(nil, nil),
  1459  					1,
  1460  				)
  1461  				app.CustomGovKeeper.SaveNetworkActor(ctx, actor)
  1462  
  1463  				// Create proposal
  1464  				proposal, err := types.NewProposal(
  1465  					1,
  1466  					"title",
  1467  					"some desc",
  1468  					types.NewUpsertDataRegistryProposal(
  1469  						"theKey",
  1470  						"theHash",
  1471  						"theReference",
  1472  						"theEncoding",
  1473  						1234,
  1474  					),
  1475  					ctx.BlockTime(),
  1476  					ctx.BlockTime().Add(time.Second*20),
  1477  					ctx.BlockTime().Add(time.Second*30),
  1478  					ctx.BlockHeight()+2,
  1479  					ctx.BlockHeight()+3,
  1480  				)
  1481  				require.NoError(t, err)
  1482  				app.CustomGovKeeper.SaveProposal(ctx, proposal)
  1483  			},
  1484  			fmt.Errorf("%s: not enough permissions", types.PermVoteUpsertDataRegistryProposal.String()),
  1485  		},
  1486  		{
  1487  			"Proposal does not exist",
  1488  			types.NewMsgVoteProposal(
  1489  				1, voterAddr, types.OptionAbstain, sdk.ZeroDec(),
  1490  			),
  1491  			func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {
  1492  				actor := types.NewNetworkActor(
  1493  					voterAddr,
  1494  					[]uint64{},
  1495  					types.Active,
  1496  					[]types.VoteOption{},
  1497  					types.NewPermissions(nil, nil),
  1498  					1,
  1499  				)
  1500  				app.CustomGovKeeper.SaveNetworkActor(ctx, actor)
  1501  				err2 := app.CustomGovKeeper.AddWhitelistPermission(ctx, actor, types.PermVoteWhitelistAccountPermissionProposal)
  1502  				require.NoError(t, err2)
  1503  			},
  1504  			types.ErrProposalDoesNotExist,
  1505  		},
  1506  		{
  1507  			"Voter is not active",
  1508  			types.NewMsgVoteProposal(
  1509  				1, voterAddr, types.OptionAbstain, sdk.ZeroDec(),
  1510  			),
  1511  			func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {
  1512  				actor := types.NewDefaultActor(voterAddr)
  1513  				actor.Deactivate()
  1514  				app.CustomGovKeeper.SaveNetworkActor(ctx, actor)
  1515  				err2 := app.CustomGovKeeper.AddWhitelistPermission(ctx, actor, types.PermVoteWhitelistAccountPermissionProposal)
  1516  				require.NoError(t, err2)
  1517  			},
  1518  			types.ErrActorIsNotActive,
  1519  		},
  1520  		{
  1521  			"Voter does not have permission to vote this proposal: Change Network Property",
  1522  			types.NewMsgVoteProposal(
  1523  				1, voterAddr, types.OptionAbstain, sdk.ZeroDec(),
  1524  			),
  1525  			func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {
  1526  				actor := types.NewNetworkActor(
  1527  					voterAddr,
  1528  					[]uint64{},
  1529  					types.Active,
  1530  					[]types.VoteOption{},
  1531  					types.NewPermissions(nil, nil),
  1532  					1,
  1533  				)
  1534  				app.CustomGovKeeper.SaveNetworkActor(ctx, actor)
  1535  
  1536  				// Create proposal
  1537  				proposal, err := types.NewProposal(
  1538  					1,
  1539  					"title",
  1540  					"some desc",
  1541  					types.NewSetNetworkPropertyProposal(
  1542  						types.MinTxFee,
  1543  						types.NetworkPropertyValue{Value: 1234},
  1544  					),
  1545  					ctx.BlockTime(),
  1546  					ctx.BlockTime().Add(time.Second*20),
  1547  					ctx.BlockTime().Add(time.Second*30),
  1548  					ctx.BlockHeight()+2,
  1549  					ctx.BlockHeight()+3,
  1550  				)
  1551  				require.NoError(t, err)
  1552  				app.CustomGovKeeper.SaveProposal(ctx, proposal)
  1553  			},
  1554  			fmt.Errorf("%s: not enough permissions", types.PermVoteSetNetworkPropertyProposal.String()),
  1555  		},
  1556  		{
  1557  			"Voter does not have permission to vote this proposal: UpsertTokenAlias",
  1558  			types.NewMsgVoteProposal(
  1559  				1, voterAddr, types.OptionAbstain, sdk.ZeroDec(),
  1560  			),
  1561  			func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {
  1562  				actor := types.NewNetworkActor(
  1563  					voterAddr,
  1564  					[]uint64{},
  1565  					types.Active,
  1566  					[]types.VoteOption{},
  1567  					types.NewPermissions(nil, nil),
  1568  					1,
  1569  				)
  1570  				app.CustomGovKeeper.SaveNetworkActor(ctx, actor)
  1571  
  1572  				// Create proposal
  1573  				proposal, err := types.NewProposal(
  1574  					1,
  1575  					"title",
  1576  					"some desc",
  1577  					tokenstypes.NewUpsertTokenAliasProposal(
  1578  						"eur",
  1579  						"Euro",
  1580  						"theIcon",
  1581  						12,
  1582  						[]string{},
  1583  						false,
  1584  					),
  1585  					ctx.BlockTime(),
  1586  					ctx.BlockTime().Add(time.Second*20),
  1587  					ctx.BlockTime().Add(time.Second*30),
  1588  					ctx.BlockHeight()+2,
  1589  					ctx.BlockHeight()+3,
  1590  				)
  1591  				require.NoError(t, err)
  1592  				app.CustomGovKeeper.SaveProposal(ctx, proposal)
  1593  			},
  1594  			fmt.Errorf("%s: not enough permissions", types.PermVoteUpsertTokenAliasProposal.String()),
  1595  		},
  1596  	}
  1597  
  1598  	for _, tt := range tests {
  1599  		tt := tt
  1600  		t.Run(tt.name, func(t *testing.T) {
  1601  			app := simapp.Setup(false)
  1602  			ctx := app.NewContext(false, tmproto.Header{}).WithBlockTime(time.Now())
  1603  
  1604  			tt.preparePerms(t, app, ctx)
  1605  
  1606  			// Add some BlockTime.
  1607  			ctx = ctx.WithBlockTime(ctx.BlockTime().Add(time.Second * 10))
  1608  
  1609  			handler := gov.NewHandler(app.CustomGovKeeper)
  1610  			_, err := handler(ctx, tt.msg)
  1611  			require.EqualError(t, err, tt.expectedErr.Error())
  1612  		})
  1613  	}
  1614  }
  1615  
  1616  func TestHandler_VoteProposal(t *testing.T) {
  1617  	voterAddr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d")
  1618  	require.NoError(t, err)
  1619  
  1620  	app := simapp.Setup(false)
  1621  	ctx := app.NewContext(false, tmproto.Header{})
  1622  
  1623  	// Create Voter as active actor.
  1624  	actor := types.NewNetworkActor(
  1625  		voterAddr,
  1626  		[]uint64{},
  1627  		types.Active,
  1628  		[]types.VoteOption{},
  1629  		types.NewPermissions(nil, nil),
  1630  		1,
  1631  	)
  1632  	app.CustomGovKeeper.SaveNetworkActor(ctx, actor)
  1633  	err2 := app.CustomGovKeeper.AddWhitelistPermission(ctx, actor, types.PermVoteWhitelistAccountPermissionProposal)
  1634  	require.NoError(t, err2)
  1635  
  1636  	// Create proposal
  1637  	proposal, err := types.NewProposal(
  1638  		1,
  1639  		"title",
  1640  		"some desc",
  1641  		types.NewWhitelistAccountPermissionProposal(
  1642  			voterAddr,
  1643  			types.PermClaimCouncilor,
  1644  		),
  1645  		ctx.BlockTime(),
  1646  		ctx.BlockTime().Add(time.Second*1),
  1647  		ctx.BlockTime().Add(time.Second*10),
  1648  		ctx.BlockHeight()+2,
  1649  		ctx.BlockHeight()+3,
  1650  	)
  1651  	require.NoError(t, err)
  1652  	app.CustomGovKeeper.SaveProposal(ctx, proposal)
  1653  
  1654  	msg := types.NewMsgVoteProposal(proposal.ProposalId, voterAddr, types.OptionAbstain, sdk.ZeroDec())
  1655  	handler := gov.NewHandler(app.CustomGovKeeper)
  1656  	_, err = handler(ctx, msg)
  1657  	require.NoError(t, err)
  1658  
  1659  	vote, found := app.CustomGovKeeper.GetVote(ctx, proposal.ProposalId, voterAddr)
  1660  	require.True(t, found)
  1661  	require.Equal(t, types.NewVote(proposal.ProposalId, voterAddr, types.OptionAbstain, sdk.ZeroDec()), vote)
  1662  }
  1663  
  1664  func setPermissionToAddr(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context, addr sdk.AccAddress, perm types.PermValue) error {
  1665  	proposerActor := types.NewDefaultActor(addr)
  1666  	err := app.CustomGovKeeper.AddWhitelistPermission(ctx, proposerActor, perm)
  1667  	require.NoError(t, err)
  1668  
  1669  	return nil
  1670  }
  1671  
  1672  func TestHandler_CreateProposalSetNetworkProperty_Errors(t *testing.T) {
  1673  	proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f")
  1674  	require.NoError(t, err)
  1675  
  1676  	tests := []struct {
  1677  		name         string
  1678  		content      types.Content
  1679  		preparePerms func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context)
  1680  		expectedErr  error
  1681  	}{
  1682  		{
  1683  			"Proposer does not have Perm",
  1684  			types.NewSetNetworkPropertyProposal(
  1685  				types.MaxTxFee,
  1686  				types.NetworkPropertyValue{Value: 100000},
  1687  			),
  1688  			func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {},
  1689  			errors.Wrap(types.ErrNotEnoughPermissions, types.PermCreateSetNetworkPropertyProposal.String()),
  1690  		},
  1691  	}
  1692  
  1693  	for _, tt := range tests {
  1694  		tt := tt
  1695  		t.Run(tt.name, func(t *testing.T) {
  1696  			app := simapp.Setup(false)
  1697  			ctx := app.NewContext(false, tmproto.Header{})
  1698  
  1699  			tt.preparePerms(t, app, ctx)
  1700  
  1701  			handler := gov.NewHandler(app.CustomGovKeeper)
  1702  			msg, err := types.NewMsgSubmitProposal(proposerAddr, "title", "some desc", tt.content)
  1703  			require.NoError(t, err)
  1704  			_, err = handler(ctx, msg)
  1705  			require.EqualError(t, err, tt.expectedErr.Error())
  1706  		})
  1707  	}
  1708  }
  1709  
  1710  func TestHandler_ProposalSetNetworkProperty(t *testing.T) {
  1711  	proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f")
  1712  	require.NoError(t, err)
  1713  
  1714  	app := simapp.Setup(false)
  1715  	ctx := app.NewContext(false, tmproto.Header{
  1716  		Time: time.Now(),
  1717  	})
  1718  
  1719  	// Set proposer Permissions
  1720  	proposerActor := types.NewDefaultActor(proposerAddr)
  1721  	err2 := app.CustomGovKeeper.AddWhitelistPermission(ctx, proposerActor, types.PermCreateSetNetworkPropertyProposal)
  1722  	require.NoError(t, err2)
  1723  
  1724  	properties := app.CustomGovKeeper.GetNetworkProperties(ctx)
  1725  	properties.MinimumProposalEndTime = 10
  1726  	app.CustomGovKeeper.SetNetworkProperties(ctx, properties)
  1727  
  1728  	handler := gov.NewHandler(app.CustomGovKeeper)
  1729  	proposal := types.NewSetNetworkPropertyProposal(
  1730  		types.MinTxFee,
  1731  		types.NetworkPropertyValue{Value: 1234},
  1732  	)
  1733  	msg, err := types.NewMsgSubmitProposal(proposerAddr, "title", "some desc", proposal)
  1734  	require.NoError(t, err)
  1735  	res, err := handler(
  1736  		ctx,
  1737  		msg,
  1738  	)
  1739  	require.NoError(t, err)
  1740  
  1741  	expData, _ := proto.Marshal(&types.MsgSubmitProposalResponse{ProposalID: 1})
  1742  	require.Equal(t, expData, res.Data)
  1743  
  1744  	savedProposal, found := app.CustomGovKeeper.GetProposal(ctx, 1)
  1745  	require.True(t, found)
  1746  
  1747  	expectedSavedProposal, err := types.NewProposal(
  1748  		1,
  1749  		"title",
  1750  		"some desc",
  1751  		types.NewSetNetworkPropertyProposal(
  1752  			types.MinTxFee,
  1753  			types.NetworkPropertyValue{Value: 1234},
  1754  		),
  1755  		ctx.BlockTime(),
  1756  		ctx.BlockTime().Add(time.Second*time.Duration(properties.MinimumProposalEndTime)),
  1757  		ctx.BlockTime().Add(time.Second*time.Duration(properties.ProposalEnactmentTime)+time.Second*time.Duration(properties.MinimumProposalEndTime)),
  1758  		ctx.BlockHeight()+2,
  1759  		ctx.BlockHeight()+3,
  1760  	)
  1761  	require.NoError(t, err)
  1762  	require.Equal(t, expectedSavedProposal, savedProposal)
  1763  
  1764  	// Next proposal ID is increased.
  1765  	id := app.CustomGovKeeper.GetNextProposalID(ctx)
  1766  	require.Equal(t, uint64(2), id)
  1767  
  1768  	// Is not on finished active proposals.
  1769  	iterator := app.CustomGovKeeper.GetActiveProposalsWithFinishedVotingEndTimeIterator(ctx, ctx.BlockTime())
  1770  	require.False(t, iterator.Valid())
  1771  
  1772  	ctx = ctx.WithBlockTime(ctx.BlockTime().Add(time.Minute * 10))
  1773  	iterator = app.CustomGovKeeper.GetActiveProposalsWithFinishedVotingEndTimeIterator(ctx, ctx.BlockTime())
  1774  	require.True(t, iterator.Valid())
  1775  }
  1776  
  1777  func TestHandler_CreateProposalCreateRole_Errors(t *testing.T) {
  1778  	proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f")
  1779  	require.NoError(t, err)
  1780  
  1781  	tests := []struct {
  1782  		name         string
  1783  		content      types.Content
  1784  		preparePerms func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context)
  1785  		expectedErr  error
  1786  	}{
  1787  		{
  1788  			"Proposer does not have Perm",
  1789  			types.NewCreateRoleProposal(
  1790  				"role1",
  1791  				"role1 description",
  1792  				[]types.PermValue{},
  1793  				[]types.PermValue{types.PermClaimValidator},
  1794  			),
  1795  			func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {},
  1796  			errors.Wrap(types.ErrNotEnoughPermissions, types.PermCreateRoleProposal.String()),
  1797  		},
  1798  		{
  1799  			"role already exist",
  1800  			types.NewCreateRoleProposal(
  1801  				"role1",
  1802  				"role1 description",
  1803  				[]types.PermValue{types.PermClaimCouncilor},
  1804  				[]types.PermValue{},
  1805  			),
  1806  			func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {
  1807  				proposerActor := types.NewDefaultActor(proposerAddr)
  1808  				err := app.CustomGovKeeper.AddWhitelistPermission(
  1809  					ctx,
  1810  					proposerActor,
  1811  					types.PermCreateRoleProposal,
  1812  				)
  1813  				require.NoError(t, err)
  1814  
  1815  				app.CustomGovKeeper.SetRole(ctx, types.Role{
  1816  					Id:          1,
  1817  					Sid:         "role1",
  1818  					Description: "role1 description",
  1819  				})
  1820  			},
  1821  			types.ErrRoleExist,
  1822  		},
  1823  		{
  1824  			"permissions are empty",
  1825  			types.NewCreateRoleProposal(
  1826  				"role1000",
  1827  				"role1000 description",
  1828  				[]types.PermValue{},
  1829  				[]types.PermValue{},
  1830  			),
  1831  			func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {
  1832  				proposerActor := types.NewDefaultActor(proposerAddr)
  1833  				err := app.CustomGovKeeper.AddWhitelistPermission(
  1834  					ctx,
  1835  					proposerActor,
  1836  					types.PermCreateRoleProposal,
  1837  				)
  1838  				require.NoError(t, err)
  1839  			},
  1840  			types.ErrEmptyPermissions,
  1841  		},
  1842  	}
  1843  
  1844  	for _, tt := range tests {
  1845  		tt := tt
  1846  		t.Run(tt.name, func(t *testing.T) {
  1847  			app := simapp.Setup(false)
  1848  			ctx := app.NewContext(false, tmproto.Header{})
  1849  
  1850  			tt.preparePerms(t, app, ctx)
  1851  
  1852  			handler := gov.NewHandler(app.CustomGovKeeper)
  1853  			msg, err := types.NewMsgSubmitProposal(proposerAddr, "title", "some desc", tt.content)
  1854  			require.NoError(t, err)
  1855  			_, err = handler(ctx, msg)
  1856  			require.EqualError(t, err, tt.expectedErr.Error())
  1857  		})
  1858  	}
  1859  }
  1860  
  1861  func TestHandler_ProposalCreateRole(t *testing.T) {
  1862  	proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f")
  1863  	require.NoError(t, err)
  1864  
  1865  	app := simapp.Setup(false)
  1866  	ctx := app.NewContext(false, tmproto.Header{
  1867  		Time: time.Now(),
  1868  	})
  1869  
  1870  	// Set proposer Permissions
  1871  	proposerActor := types.NewDefaultActor(proposerAddr)
  1872  	err2 := app.CustomGovKeeper.AddWhitelistPermission(ctx, proposerActor, types.PermCreateRoleProposal)
  1873  	require.NoError(t, err2)
  1874  
  1875  	properties := app.CustomGovKeeper.GetNetworkProperties(ctx)
  1876  	properties.MinimumProposalEndTime = 10
  1877  	app.CustomGovKeeper.SetNetworkProperties(ctx, properties)
  1878  
  1879  	handler := gov.NewHandler(app.CustomGovKeeper)
  1880  	proposal := types.NewCreateRoleProposal(
  1881  		"role1000",
  1882  		"role1000 description",
  1883  		[]types.PermValue{
  1884  			types.PermClaimValidator,
  1885  		},
  1886  		[]types.PermValue{
  1887  			types.PermChangeTxFee,
  1888  		},
  1889  	)
  1890  	msg, err := types.NewMsgSubmitProposal(proposerAddr, "title", "some desc", proposal)
  1891  	require.NoError(t, err)
  1892  	res, err := handler(
  1893  		ctx,
  1894  		msg,
  1895  	)
  1896  	require.NoError(t, err)
  1897  
  1898  	expData, _ := proto.Marshal(&types.MsgSubmitProposalResponse{ProposalID: 1})
  1899  	require.Equal(t, expData, res.Data)
  1900  
  1901  	savedProposal, found := app.CustomGovKeeper.GetProposal(ctx, 1)
  1902  	require.True(t, found)
  1903  
  1904  	expectedSavedProposal, err := types.NewProposal(
  1905  		1,
  1906  		"title",
  1907  		"some desc",
  1908  		types.NewCreateRoleProposal(
  1909  			"role1000",
  1910  			"role1000 description",
  1911  			[]types.PermValue{
  1912  				types.PermClaimValidator,
  1913  			},
  1914  			[]types.PermValue{
  1915  				types.PermChangeTxFee,
  1916  			},
  1917  		),
  1918  		ctx.BlockTime(),
  1919  		ctx.BlockTime().Add(time.Second*time.Duration(properties.MinimumProposalEndTime)),
  1920  		ctx.BlockTime().Add(time.Second*time.Duration(properties.ProposalEnactmentTime)+time.Second*time.Duration(properties.MinimumProposalEndTime)),
  1921  		ctx.BlockHeight()+2,
  1922  		ctx.BlockHeight()+3,
  1923  	)
  1924  	require.NoError(t, err)
  1925  	require.Equal(t, expectedSavedProposal, savedProposal)
  1926  
  1927  	// Next proposal ID is increased.
  1928  	id := app.CustomGovKeeper.GetNextProposalID(ctx)
  1929  	require.Equal(t, uint64(2), id)
  1930  
  1931  	// Is not on finished active proposals.
  1932  	iterator := app.CustomGovKeeper.GetActiveProposalsWithFinishedVotingEndTimeIterator(ctx, ctx.BlockTime())
  1933  	require.False(t, iterator.Valid())
  1934  
  1935  	ctx = ctx.WithBlockTime(ctx.BlockTime().Add(time.Minute * 10))
  1936  	iterator = app.CustomGovKeeper.GetActiveProposalsWithFinishedVotingEndTimeIterator(ctx, ctx.BlockTime())
  1937  	require.True(t, iterator.Valid())
  1938  }
  1939  
  1940  func TestHandler_SetProposalDurationsProposal(t *testing.T) {
  1941  	app := simapp.Setup(false)
  1942  	ctx := app.NewContext(false, tmproto.Header{
  1943  		Time: time.Now(),
  1944  	})
  1945  
  1946  	proposal := types.NewSetProposalDurationsProposal(
  1947  		[]string{kiratypes.ProposalTypeCreateRole, kiratypes.ProposalTypeSetNetworkProperty},
  1948  		[]uint64{1200, 2400}, // 20 min, 40min
  1949  	)
  1950  
  1951  	router := app.CustomGovKeeper.GetProposalRouter()
  1952  	err := router.ApplyProposal(ctx, 1, proposal, sdk.ZeroDec())
  1953  	require.NoError(t, err)
  1954  
  1955  	duration := app.CustomGovKeeper.GetProposalDuration(ctx, kiratypes.ProposalTypeCreateRole)
  1956  	require.Equal(t, duration, uint64(1200))
  1957  
  1958  	duration = app.CustomGovKeeper.GetProposalDuration(ctx, kiratypes.ProposalTypeSetNetworkProperty)
  1959  	require.Equal(t, duration, uint64(2400))
  1960  }