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

     1  package keeper_test
     2  
     3  import (
     4  	"strings"
     5  	"testing"
     6  	"time"
     7  
     8  	simapp "github.com/KiraCore/sekai/app"
     9  	appparams "github.com/KiraCore/sekai/app/params"
    10  	"github.com/KiraCore/sekai/x/gov/keeper"
    11  	"github.com/KiraCore/sekai/x/gov/types"
    12  	tmproto "github.com/cometbft/cometbft/proto/tendermint/types"
    13  	sdk "github.com/cosmos/cosmos-sdk/types"
    14  	minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
    15  	"github.com/stretchr/testify/require"
    16  )
    17  
    18  func TestKeeper_ValidateIdentityRecordKey(t *testing.T) {
    19  	require.False(t, keeper.ValidateIdentityRecordKey("_abc"))
    20  	require.False(t, keeper.ValidateIdentityRecordKey("1abc"))
    21  	require.True(t, keeper.ValidateIdentityRecordKey("ab_a"))
    22  	require.True(t, keeper.ValidateIdentityRecordKey("ab_1a"))
    23  	require.True(t, keeper.ValidateIdentityRecordKey("aa_Aa"))
    24  }
    25  
    26  func TestKeeper_CheckIfWithinAddressArray(t *testing.T) {
    27  	addr1 := sdk.AccAddress("foo1________________")
    28  	addr2 := sdk.AccAddress("foo2________________")
    29  	addr3 := sdk.AccAddress("foo3________________")
    30  	addr4 := sdk.AccAddress("foo4________________")
    31  
    32  	array := []sdk.AccAddress{addr1, addr2, addr3}
    33  
    34  	require.True(t, keeper.CheckIfWithinAddressArray(addr1, array))
    35  	require.True(t, keeper.CheckIfWithinAddressArray(addr2, array))
    36  	require.True(t, keeper.CheckIfWithinAddressArray(addr3, array))
    37  	require.False(t, keeper.CheckIfWithinAddressArray(addr4, array))
    38  }
    39  
    40  func TestKeeper_LastIdentityRecordId(t *testing.T) {
    41  	app := simapp.Setup(false)
    42  	ctx := app.NewContext(false, tmproto.Header{})
    43  
    44  	lastRecordId := app.CustomGovKeeper.GetLastIdentityRecordId(ctx)
    45  	require.Equal(t, lastRecordId, uint64(0))
    46  
    47  	app.CustomGovKeeper.SetLastIdentityRecordId(ctx, 5)
    48  
    49  	lastRecordId = app.CustomGovKeeper.GetLastIdentityRecordId(ctx)
    50  	require.Equal(t, lastRecordId, uint64(5))
    51  }
    52  
    53  func TestKeeper_LastIdRecordVerifyRequestId(t *testing.T) {
    54  	app := simapp.Setup(false)
    55  	ctx := app.NewContext(false, tmproto.Header{})
    56  
    57  	lastRecordId := app.CustomGovKeeper.GetLastIdRecordVerifyRequestId(ctx)
    58  	require.Equal(t, lastRecordId, uint64(0))
    59  
    60  	app.CustomGovKeeper.SetLastIdRecordVerifyRequestId(ctx, 5)
    61  
    62  	lastRecordId = app.CustomGovKeeper.GetLastIdRecordVerifyRequestId(ctx)
    63  	require.Equal(t, lastRecordId, uint64(5))
    64  }
    65  
    66  func TestKeeper_IdentityRecordBasicFlow(t *testing.T) {
    67  	app := simapp.Setup(false)
    68  	ctx := app.NewContext(false, tmproto.Header{})
    69  
    70  	// try to get non existent record
    71  	record := app.CustomGovKeeper.GetIdentityRecordById(ctx, 1)
    72  	require.Nil(t, record)
    73  
    74  	// create a new record and check if set correctly
    75  	addr1 := sdk.AccAddress("foo1________________")
    76  	addr2 := sdk.AccAddress("foo2________________")
    77  	addr3 := sdk.AccAddress("foo3________________")
    78  	newRecord := types.IdentityRecord{
    79  		Id:        1,
    80  		Address:   addr1.String(),
    81  		Key:       "key",
    82  		Value:     "value",
    83  		Date:      time.Now().UTC(),
    84  		Verifiers: []string{addr2.String(), addr3.String()},
    85  	}
    86  	app.CustomGovKeeper.SetIdentityRecord(ctx, newRecord)
    87  	record = app.CustomGovKeeper.GetIdentityRecordById(ctx, 1)
    88  	require.NotNil(t, record)
    89  	require.Equal(t, *record, newRecord)
    90  
    91  	// check no panics
    92  	app.CustomGovKeeper.DeleteIdentityRecordById(ctx, 0)
    93  
    94  	// remove existing id and check
    95  	app.CustomGovKeeper.DeleteIdentityRecordById(ctx, 1)
    96  	record = app.CustomGovKeeper.GetIdentityRecordById(ctx, 1)
    97  	require.Nil(t, record)
    98  
    99  	// check automatic conversion to lowercase
   100  	uppercaseRecord := types.IdentityRecord{
   101  		Id:        2,
   102  		Address:   addr1.String(),
   103  		Key:       "MyKey",
   104  		Value:     "value",
   105  		Date:      time.Now().UTC(),
   106  		Verifiers: []string{addr2.String(), addr3.String()},
   107  	}
   108  	app.CustomGovKeeper.SetIdentityRecord(ctx, uppercaseRecord)
   109  	record = app.CustomGovKeeper.GetIdentityRecordById(ctx, 2)
   110  	require.NotNil(t, record)
   111  	require.Equal(t, record.Key, "mykey")
   112  
   113  	// try to get via uppercase key
   114  	recordId := app.CustomGovKeeper.GetIdentityRecordIdByAddressKey(ctx, addr1, "MYKEY")
   115  	require.Equal(t, recordId, uint64(2))
   116  
   117  	// try to get by key
   118  	recordId = app.CustomGovKeeper.GetIdentityRecordIdByAddressKey(ctx, addr1, "_key")
   119  	require.Equal(t, recordId, uint64(0))
   120  
   121  	// check invalid key set
   122  	invalidRecord := types.IdentityRecord{
   123  		Id:        1,
   124  		Address:   addr1.String(),
   125  		Key:       "_key",
   126  		Value:     "value",
   127  		Date:      time.Now().UTC(),
   128  		Verifiers: []string{addr2.String(), addr3.String()},
   129  	}
   130  	require.Panics(t, func() {
   131  		app.CustomGovKeeper.SetIdentityRecord(ctx, invalidRecord)
   132  	})
   133  }
   134  
   135  func TestKeeper_IdentityRecordAddEditRemove(t *testing.T) {
   136  	app := simapp.Setup(false)
   137  	ctx := app.NewContext(false, tmproto.Header{})
   138  
   139  	// create a new record and check if set correctly
   140  	addr1 := sdk.AccAddress("foo1________________")
   141  	addr2 := sdk.AccAddress("foo2________________")
   142  	addr3 := sdk.AccAddress("foo3________________")
   143  	infos := make(map[string]string)
   144  	infos["key"] = "value"
   145  	now := time.Now().UTC()
   146  	ctx = ctx.WithBlockTime(now)
   147  	err := app.CustomGovKeeper.RegisterIdentityRecords(ctx, addr1, types.WrapInfos(infos))
   148  	require.NoError(t, err)
   149  
   150  	record := app.CustomGovKeeper.GetIdentityRecordById(ctx, 1)
   151  	require.NotNil(t, record)
   152  	expectedRecord := types.IdentityRecord{
   153  		Id:      1,
   154  		Address: addr1.String(),
   155  		Key:     "key",
   156  		Value:   "value",
   157  		Date:    now,
   158  	}
   159  	require.Equal(t, *record, expectedRecord)
   160  
   161  	err = app.CustomGovKeeper.RegisterIdentityRecords(ctx, addr2, types.WrapInfos(infos))
   162  	require.NoError(t, err)
   163  
   164  	records := app.CustomGovKeeper.GetAllIdentityRecords(ctx)
   165  	require.Len(t, records, 2)
   166  	records = app.CustomGovKeeper.GetIdRecordsByAddress(ctx, addr1)
   167  	require.NotNil(t, records)
   168  	records = app.CustomGovKeeper.GetIdRecordsByAddress(ctx, addr2)
   169  	require.NotNil(t, records)
   170  
   171  	// remove existing id and check
   172  	app.CustomGovKeeper.DeleteIdentityRecords(ctx, addr2, []string{})
   173  	records = app.CustomGovKeeper.GetIdRecordsByAddress(ctx, addr2)
   174  	require.Len(t, records, 0)
   175  	records = app.CustomGovKeeper.GetIdRecordsByAddress(ctx, addr1)
   176  	require.Len(t, records, 1)
   177  	records = app.CustomGovKeeper.GetAllIdentityRecords(ctx)
   178  	require.Len(t, records, 1)
   179  
   180  	infos["key1"] = "value1"
   181  	now = now.Add(time.Second)
   182  	ctx = ctx.WithBlockTime(now)
   183  
   184  	// try deleting one key
   185  	err = app.CustomGovKeeper.DeleteIdentityRecords(ctx, addr3, []string{"key1"})
   186  	require.NoError(t, err)
   187  
   188  	// set verifier of identity record
   189  	app.CustomGovKeeper.RegisterIdentityRecords(ctx, addr1, types.WrapInfos(infos))
   190  
   191  	err = app.CustomGovKeeper.RegisterIdentityRecords(ctx, addr1, types.WrapInfos(infos))
   192  	require.NoError(t, err)
   193  	record = app.CustomGovKeeper.GetIdentityRecordById(ctx, 1)
   194  	require.NotNil(t, record)
   195  	require.Equal(t, *record, types.IdentityRecord{
   196  		Id:      1,
   197  		Address: addr1.String(),
   198  		Key:     "key",
   199  		Value:   "value",
   200  		Date:    now,
   201  	})
   202  	records = app.CustomGovKeeper.GetAllIdentityRecords(ctx)
   203  	require.Len(t, records, 2)
   204  	records = app.CustomGovKeeper.GetIdRecordsByAddress(ctx, addr1)
   205  	require.NotNil(t, record)
   206  	records = app.CustomGovKeeper.GetIdRecordsByAddress(ctx, addr2)
   207  	require.Len(t, records, 0)
   208  
   209  	// check identity records by address
   210  	records = app.CustomGovKeeper.GetIdRecordsByAddress(ctx, addr1)
   211  	require.Len(t, records, 2)
   212  
   213  	// check identity records by address and keys
   214  	records, err = app.CustomGovKeeper.GetIdRecordsByAddressAndKeys(ctx, addr1, []string{})
   215  	require.NoError(t, err)
   216  	require.Len(t, records, 2)
   217  
   218  	records, err = app.CustomGovKeeper.GetIdRecordsByAddressAndKeys(ctx, addr1, []string{"key"})
   219  	require.NoError(t, err)
   220  	require.Len(t, records, 1)
   221  
   222  	records, err = app.CustomGovKeeper.GetIdRecordsByAddressAndKeys(ctx, addr1, []string{"invalidkey"})
   223  	require.Error(t, err)
   224  }
   225  
   226  func TestKeeper_TryLongMonikerField(t *testing.T) {
   227  	app := simapp.Setup(false)
   228  	ctx := app.NewContext(false, tmproto.Header{})
   229  
   230  	// create a new record and check if set correctly
   231  	addr1 := sdk.AccAddress("foo1________________")
   232  	infos := make(map[string]string)
   233  	infos["moniker"] = strings.Repeat("A", 33)
   234  	now := time.Now().UTC()
   235  	ctx = ctx.WithBlockTime(now)
   236  	err := app.CustomGovKeeper.RegisterIdentityRecords(ctx, addr1, types.WrapInfos(infos))
   237  	require.Error(t, err)
   238  }
   239  
   240  func TestKeeper_TrySameMonikerField(t *testing.T) {
   241  	app := simapp.Setup(false)
   242  	ctx := app.NewContext(false, tmproto.Header{})
   243  
   244  	// create a new record and check if set correctly
   245  	addr1 := sdk.AccAddress("foo1________________")
   246  	addr2 := sdk.AccAddress("foo2________________")
   247  	infos := make(map[string]string)
   248  	infos["moniker"] = "AAA"
   249  	now := time.Now().UTC()
   250  	ctx = ctx.WithBlockTime(now)
   251  	err := app.CustomGovKeeper.RegisterIdentityRecords(ctx, addr1, types.WrapInfos(infos))
   252  	require.NoError(t, err)
   253  	err = app.CustomGovKeeper.RegisterIdentityRecords(ctx, addr1, types.WrapInfos(infos))
   254  	require.NoError(t, err)
   255  	err = app.CustomGovKeeper.RegisterIdentityRecords(ctx, addr2, types.WrapInfos(infos))
   256  	require.Error(t, err)
   257  	infos["moniker"] = "AAA2"
   258  	err = app.CustomGovKeeper.RegisterIdentityRecords(ctx, addr2, types.WrapInfos(infos))
   259  	require.NoError(t, err)
   260  }
   261  
   262  func TestKeeper_TryUniqueIdentityKeysSet(t *testing.T) {
   263  	app := simapp.Setup(false)
   264  	ctx := app.NewContext(false, tmproto.Header{})
   265  
   266  	// create a new record and check if set correctly
   267  	now := time.Now().UTC()
   268  	ctx = ctx.WithBlockTime(now)
   269  	err := app.CustomGovKeeper.SetNetworkProperty(ctx, types.UniqueIdentityKeys, types.NetworkPropertyValue{StrValue: "moniker,email"})
   270  	require.NoError(t, err)
   271  	networkProperties := app.CustomGovKeeper.GetNetworkProperties(ctx)
   272  	require.NotNil(t, networkProperties)
   273  
   274  	require.Equal(t, networkProperties.UniqueIdentityKeys, "moniker,email")
   275  }
   276  
   277  // func TestKeeper_IdentityKeysManagement(t *testing.T) {
   278  // 	app := simapp.Setup(false)
   279  // 	ctx := app.NewContext(false, tmproto.Header{})
   280  
   281  // 	// create a new record and check if set correctly
   282  // 	addr1 := sdk.AccAddress("foo1________________")
   283  // 	infos := make(map[string]string)
   284  // 	infos["MyKey"] = "MyValue"
   285  // 	infos["Nike"] = "MyNike"
   286  // 	now := time.Now().UTC()
   287  // 	ctx = ctx.WithBlockTime(now)
   288  // 	err := app.CustomGovKeeper.RegisterIdentityRecords(ctx, addr1, types.WrapInfos(infos))
   289  // 	require.NoError(t, err)
   290  
   291  // 	record := app.CustomGovKeeper.GetIdentityRecordById(ctx, 1)
   292  // 	require.NotNil(t, record)
   293  // 	expectedRecord := types.IdentityRecord{
   294  // 		Id:      1,
   295  // 		Address: addr1.String(),
   296  // 		Key:     "mykey",
   297  // 		Value:   "MyValue",
   298  // 		Date:    now,
   299  // 	}
   300  // 	require.Equal(t, *record, expectedRecord)
   301  
   302  // 	record = app.CustomGovKeeper.GetIdentityRecordById(ctx, 2)
   303  // 	require.NotNil(t, record)
   304  // 	expectedRecord = types.IdentityRecord{
   305  // 		Id:      2,
   306  // 		Address: addr1.String(),
   307  // 		Key:     "nike",
   308  // 		Value:   "MyNike",
   309  // 		Date:    now,
   310  // 	}
   311  // 	require.Equal(t, *record, expectedRecord)
   312  
   313  // 	// check invalid key involved registration
   314  // 	infos["1Nike"] = "MyNike"
   315  // 	err = app.CustomGovKeeper.RegisterIdentityRecords(ctx, addr1, types.WrapInfos(infos))
   316  // 	require.Error(t, err)
   317  
   318  // 	records, err := app.CustomGovKeeper.GetIdRecordsByAddressAndKeys(ctx, addr1, []string{"MyKey", "nike"})
   319  // 	require.NoError(t, err)
   320  // 	require.Len(t, records, 2)
   321  
   322  // 	records, err = app.CustomGovKeeper.GetIdRecordsByAddressAndKeys(ctx, addr1, []string{"MyKey", "nike", "A"})
   323  // 	require.Error(t, err)
   324  
   325  // 	records, err = app.CustomGovKeeper.GetIdRecordsByAddressAndKeys(ctx, addr1, []string{"MyKey", "nike", "_"})
   326  // 	require.Error(t, err)
   327  
   328  // 	// get address from identity record key value
   329  // 	addrs := app.CustomGovKeeper.GetAddressesByIdRecordKey(ctx, "mykey", "MyValue")
   330  // 	require.Len(t, addrs, 1)
   331  
   332  // 	addrs = app.CustomGovKeeper.GetAddressesByIdRecordKey(ctx, "mykey", "MyValue2")
   333  // 	require.Len(t, addrs, 0)
   334  
   335  // 	// delete by uppercase key and check if deleted correctly
   336  // 	err = app.CustomGovKeeper.DeleteIdentityRecords(ctx, addr1, []string{"myKey"})
   337  // 	require.NoError(t, err)
   338  
   339  // 	records, err = app.CustomGovKeeper.GetIdRecordsByAddressAndKeys(ctx, addr1, []string{"MyKey"})
   340  // 	require.Error(t, err)
   341  
   342  // 	// test for moniker field deletion is not enabled
   343  // 	err = app.CustomGovKeeper.RegisterIdentityRecords(ctx, addr1, []types.IdentityInfoEntry{
   344  // 		{
   345  // 			Key:  "moniker",
   346  // 			Info: "node0",
   347  // 		},
   348  // 	})
   349  // 	require.NoError(t, err)
   350  // 	err = app.CustomGovKeeper.DeleteIdentityRecords(ctx, addr1, []string{"moniker"})
   351  // 	require.Error(t, err)
   352  // }
   353  
   354  func TestKeeper_IdentityRecordApproveFlow(t *testing.T) {
   355  	app := simapp.Setup(false)
   356  	ctx := app.NewContext(false, tmproto.Header{})
   357  
   358  	// create a new record and check if set correctly
   359  	addr1 := sdk.AccAddress("foo1________________")
   360  	addr2 := sdk.AccAddress("foo2________________")
   361  	addr3 := sdk.AccAddress("foo3________________")
   362  	addr4 := sdk.AccAddress("foo4________________")
   363  	initCoins := sdk.Coins{sdk.NewInt64Coin(appparams.DefaultDenom, 10000)}
   364  	app.BankKeeper.MintCoins(ctx, minttypes.ModuleName, initCoins)
   365  	app.BankKeeper.MintCoins(ctx, minttypes.ModuleName, initCoins)
   366  	app.BankKeeper.MintCoins(ctx, minttypes.ModuleName, initCoins)
   367  	app.BankKeeper.SendCoinsFromModuleToAccount(ctx, minttypes.ModuleName, addr1, initCoins)
   368  	app.BankKeeper.SendCoinsFromModuleToAccount(ctx, minttypes.ModuleName, addr2, initCoins)
   369  	app.BankKeeper.SendCoinsFromModuleToAccount(ctx, minttypes.ModuleName, addr3, initCoins)
   370  
   371  	infos := make(map[string]string)
   372  	infos["key"] = "value"
   373  	now := time.Now().UTC()
   374  	ctx = ctx.WithBlockTime(now)
   375  	err := app.CustomGovKeeper.RegisterIdentityRecords(ctx, addr1, types.WrapInfos(infos))
   376  	require.NoError(t, err)
   377  
   378  	record := app.CustomGovKeeper.GetIdentityRecordById(ctx, 1)
   379  	require.NotNil(t, record)
   380  	expectedRecord := types.IdentityRecord{
   381  		Id:      1,
   382  		Address: addr1.String(),
   383  		Key:     "key",
   384  		Value:   "value",
   385  		Date:    now,
   386  	}
   387  	require.Equal(t, *record, expectedRecord)
   388  
   389  	err = app.CustomGovKeeper.RegisterIdentityRecords(ctx, addr2, types.WrapInfos(infos))
   390  	require.NoError(t, err)
   391  
   392  	// bigger tip than balance
   393  	ctxCache, _ := ctx.CacheContext()
   394  	reqId, err := app.CustomGovKeeper.RequestIdentityRecordsVerify(ctxCache, addr1, addr3, []uint64{1}, sdk.NewInt64Coin(appparams.DefaultDenom, 1000000000))
   395  	require.Equal(t, reqId, uint64(0))
   396  	require.Error(t, err)
   397  
   398  	// test smaller tip than minimum tip
   399  	ctxCache, _ = ctx.CacheContext()
   400  	reqId, err = app.CustomGovKeeper.RequestIdentityRecordsVerify(ctxCache, addr1, addr3, []uint64{1}, sdk.NewInt64Coin(appparams.DefaultDenom, 199))
   401  	require.Error(t, err)
   402  	require.Equal(t, reqId, uint64(1))
   403  
   404  	// request id record 1 to addr3 by addr1
   405  	reqId, err = app.CustomGovKeeper.RequestIdentityRecordsVerify(ctx, addr1, addr3, []uint64{1}, sdk.NewInt64Coin(appparams.DefaultDenom, 200))
   406  	require.Equal(t, reqId, uint64(1))
   407  	require.NoError(t, err)
   408  	request := app.CustomGovKeeper.GetIdRecordsVerifyRequest(ctx, 1)
   409  	require.NotNil(t, request)
   410  	require.Equal(t, *request, types.IdentityRecordsVerify{
   411  		Id:                 1,
   412  		Address:            addr1.String(),
   413  		Verifier:           addr3.String(),
   414  		RecordIds:          []uint64{1},
   415  		Tip:                sdk.NewInt64Coin(appparams.DefaultDenom, 200),
   416  		LastRecordEditDate: now,
   417  	})
   418  	coins := app.BankKeeper.GetAllBalances(ctx, addr1)
   419  	require.Equal(t, coins, sdk.Coins{sdk.NewInt64Coin(appparams.DefaultDenom, 9800)})
   420  	coins = app.BankKeeper.GetAllBalances(ctx, app.AccountKeeper.GetModuleAddress(types.ModuleName))
   421  	require.Equal(t, coins, sdk.Coins{sdk.NewInt64Coin(appparams.DefaultDenom, 200)})
   422  	err = app.CustomGovKeeper.HandleIdentityRecordsVerifyRequest(ctx, addr3, 1, true)
   423  	require.NoError(t, err)
   424  	coins = app.BankKeeper.GetAllBalances(ctx, addr3)
   425  	require.Equal(t, coins, sdk.Coins{sdk.NewInt64Coin(appparams.DefaultDenom, 10200)})
   426  	coins = app.BankKeeper.GetAllBalances(ctx, app.AccountKeeper.GetModuleAddress(types.ModuleName))
   427  	require.Equal(t, coins, sdk.Coins{})
   428  	record = app.CustomGovKeeper.GetIdentityRecordById(ctx, 1)
   429  	require.NotNil(t, record)
   430  	require.Equal(t, *record, types.IdentityRecord{
   431  		Id:        1,
   432  		Address:   addr1.String(),
   433  		Key:       "key",
   434  		Value:     "value",
   435  		Date:      now,
   436  		Verifiers: []string{addr3.String()},
   437  	})
   438  	request = app.CustomGovKeeper.GetIdRecordsVerifyRequest(ctx, 1)
   439  	require.Nil(t, request)
   440  
   441  	// request id record 1 to addr3 by addr1 again
   442  	reqId, err = app.CustomGovKeeper.RequestIdentityRecordsVerify(ctx, addr1, addr3, []uint64{1}, sdk.NewInt64Coin(appparams.DefaultDenom, 200))
   443  	require.Equal(t, reqId, uint64(2))
   444  	require.NoError(t, err)
   445  	coins = app.BankKeeper.GetAllBalances(ctx, addr1)
   446  	require.Equal(t, coins, sdk.Coins{sdk.NewInt64Coin(appparams.DefaultDenom, 9600)})
   447  	err = app.CustomGovKeeper.HandleIdentityRecordsVerifyRequest(ctx, addr3, 2, true)
   448  	require.NoError(t, err)
   449  	coins = app.BankKeeper.GetAllBalances(ctx, addr3)
   450  	require.Equal(t, coins, sdk.Coins{sdk.NewInt64Coin(appparams.DefaultDenom, 10400)})
   451  	record = app.CustomGovKeeper.GetIdentityRecordById(ctx, 1)
   452  	require.NotNil(t, record)
   453  	require.Equal(t, *record, types.IdentityRecord{
   454  		Id:        1,
   455  		Address:   addr1.String(),
   456  		Key:       "key",
   457  		Value:     "value",
   458  		Date:      now,
   459  		Verifiers: []string{addr3.String()},
   460  	})
   461  
   462  	// request id record 2 to addr3 by addr1 again
   463  	reqId, err = app.CustomGovKeeper.RequestIdentityRecordsVerify(ctx, addr2, addr3, []uint64{2}, sdk.NewInt64Coin(appparams.DefaultDenom, 200))
   464  	require.NoError(t, err)
   465  	require.Equal(t, reqId, uint64(3))
   466  
   467  	coins = app.BankKeeper.GetAllBalances(ctx, addr2)
   468  	require.Equal(t, coins, sdk.Coins{sdk.NewInt64Coin(appparams.DefaultDenom, 9800)})
   469  	err = app.CustomGovKeeper.HandleIdentityRecordsVerifyRequest(ctx, addr3, 3, true)
   470  	require.NoError(t, err)
   471  	coins = app.BankKeeper.GetAllBalances(ctx, addr3)
   472  	require.Equal(t, coins, sdk.Coins{sdk.NewInt64Coin(appparams.DefaultDenom, 10600)})
   473  	record = app.CustomGovKeeper.GetIdentityRecordById(ctx, 1)
   474  	require.NotNil(t, record)
   475  	require.Equal(t, *record, types.IdentityRecord{
   476  		Id:        1,
   477  		Address:   addr1.String(),
   478  		Key:       "key",
   479  		Value:     "value",
   480  		Date:      now,
   481  		Verifiers: []string{addr3.String()},
   482  	})
   483  	record = app.CustomGovKeeper.GetIdentityRecordById(ctx, 2)
   484  	require.NotNil(t, record)
   485  	require.Equal(t, *record, types.IdentityRecord{
   486  		Id:        2,
   487  		Address:   addr2.String(),
   488  		Key:       "key",
   489  		Value:     "value",
   490  		Date:      now,
   491  		Verifiers: []string{addr3.String()},
   492  	})
   493  
   494  	// request id record 2 to addr3 by addr2
   495  	reqId, err = app.CustomGovKeeper.RequestIdentityRecordsVerify(ctx, addr2, addr3, []uint64{2}, sdk.NewInt64Coin(appparams.DefaultDenom, 200))
   496  	require.Equal(t, reqId, uint64(4))
   497  	require.NoError(t, err)
   498  	err = app.CustomGovKeeper.HandleIdentityRecordsVerifyRequest(ctx, addr3, 4, true)
   499  	require.NoError(t, err)
   500  	record = app.CustomGovKeeper.GetIdentityRecordById(ctx, 2)
   501  	require.NotNil(t, record)
   502  	require.Equal(t, *record, types.IdentityRecord{
   503  		Id:        2,
   504  		Address:   addr2.String(),
   505  		Key:       "key",
   506  		Value:     "value",
   507  		Date:      now,
   508  		Verifiers: []string{addr3.String()},
   509  	})
   510  
   511  	// request non-exist identity record
   512  	ctxCache, _ = ctx.CacheContext()
   513  	reqId, err = app.CustomGovKeeper.RequestIdentityRecordsVerify(ctxCache, addr2, addr3, []uint64{5}, sdk.NewInt64Coin(appparams.DefaultDenom, 200))
   514  	require.Equal(t, reqId, uint64(5))
   515  	require.Error(t, err)
   516  
   517  	// approve with non-approver
   518  	reqId, err = app.CustomGovKeeper.RequestIdentityRecordsVerify(ctx, addr1, addr3, []uint64{1}, sdk.NewInt64Coin(appparams.DefaultDenom, 200))
   519  	require.Equal(t, reqId, uint64(5))
   520  	require.NoError(t, err)
   521  	ctxCache, _ = ctx.CacheContext()
   522  	err = app.CustomGovKeeper.HandleIdentityRecordsVerifyRequest(ctxCache, addr2, 5, true)
   523  	require.Error(t, err)
   524  
   525  	// approve not existing request id
   526  	ctxCache, _ = ctx.CacheContext()
   527  	err = app.CustomGovKeeper.HandleIdentityRecordsVerifyRequest(ctxCache, addr2, 0xFFFFF, true)
   528  	require.Error(t, err)
   529  
   530  	// try edit and check if verification records all gone
   531  	infos["key1"] = "value1"
   532  	err = app.CustomGovKeeper.DeleteIdentityRecords(ctx, addr1, []string{"key", "key1"})
   533  	require.NoError(t, err)
   534  	record = app.CustomGovKeeper.GetIdentityRecordById(ctx, 1)
   535  	require.Nil(t, record)
   536  
   537  	// check get queries
   538  	requests := app.CustomGovKeeper.GetIdRecordsVerifyRequestsByRequester(ctx, addr1)
   539  	require.Len(t, requests, 0)
   540  	requests = app.CustomGovKeeper.GetIdRecordsVerifyRequestsByApprover(ctx, addr1)
   541  	require.Len(t, requests, 0)
   542  	requests = app.CustomGovKeeper.GetAllIdRecordsVerifyRequests(ctx)
   543  	require.Len(t, requests, 0)
   544  
   545  	// remove all and query again
   546  	app.CustomGovKeeper.DeleteIdRecordsVerifyRequest(ctx, 5)
   547  	requests = app.CustomGovKeeper.GetAllIdRecordsVerifyRequests(ctx)
   548  	require.Len(t, requests, 0)
   549  
   550  	// try to cancel request and check coin moves correctly
   551  	reqId, err = app.CustomGovKeeper.RequestIdentityRecordsVerify(ctx, addr2, addr3, []uint64{2}, sdk.NewInt64Coin(appparams.DefaultDenom, 200))
   552  	require.Equal(t, reqId, uint64(6))
   553  	require.NoError(t, err)
   554  	coins = app.BankKeeper.GetAllBalances(ctx, addr2)
   555  	require.Equal(t, coins, sdk.Coins{sdk.NewInt64Coin(appparams.DefaultDenom, 9400)})
   556  	cacheCtx, _ := ctx.CacheContext()
   557  	err = app.CustomGovKeeper.CancelIdentityRecordsVerifyRequest(cacheCtx, addr3, 6)
   558  	require.Error(t, err)
   559  	err = app.CustomGovKeeper.CancelIdentityRecordsVerifyRequest(ctx, addr2, 6)
   560  	require.NoError(t, err)
   561  	request = app.CustomGovKeeper.GetIdRecordsVerifyRequest(ctx, 6)
   562  	require.Nil(t, request)
   563  	coins = app.BankKeeper.GetAllBalances(ctx, addr2)
   564  	require.Equal(t, coins, sdk.Coins{sdk.NewInt64Coin(appparams.DefaultDenom, 9600)})
   565  
   566  	// try deleting request after request creation
   567  	reqId, err = app.CustomGovKeeper.RequestIdentityRecordsVerify(ctx, addr2, addr3, []uint64{2}, sdk.NewInt64Coin(appparams.DefaultDenom, 200))
   568  	require.Equal(t, reqId, uint64(7))
   569  	app.CustomGovKeeper.DeleteIdRecordsVerifyRequest(ctx, 7)
   570  	request = app.CustomGovKeeper.GetIdRecordsVerifyRequest(ctx, 7)
   571  	require.Nil(t, request)
   572  	requests = app.CustomGovKeeper.GetIdRecordsVerifyRequestsByRequester(ctx, addr2)
   573  	require.Len(t, requests, 0)
   574  	requests = app.CustomGovKeeper.GetIdRecordsVerifyRequestsByApprover(ctx, addr3)
   575  	require.Len(t, requests, 0)
   576  
   577  	// check automatic reject if record is edited after raising verification request
   578  	reqId, err = app.CustomGovKeeper.RequestIdentityRecordsVerify(ctx, addr2, addr4, []uint64{2}, sdk.NewInt64Coin(appparams.DefaultDenom, 200))
   579  	require.Equal(t, reqId, uint64(8))
   580  	ctx = ctx.WithBlockTime(now.Add(time.Second))
   581  	app.CustomGovKeeper.RegisterIdentityRecords(ctx, addr2, types.WrapInfos(infos))
   582  	ctx, _ = ctx.CacheContext()
   583  	err = app.CustomGovKeeper.HandleIdentityRecordsVerifyRequest(ctx, addr4, 8, true)
   584  	require.NoError(t, err)
   585  	record = app.CustomGovKeeper.GetIdentityRecordById(ctx, 2)
   586  	require.NotNil(t, record)
   587  	require.False(t, keeper.CheckIfWithinStringArray(addr4.String(), record.Verifiers))
   588  	coins = app.BankKeeper.GetAllBalances(ctx, addr4)
   589  	require.Equal(t, coins, sdk.Coins{sdk.NewInt64Coin(appparams.DefaultDenom, 200)})
   590  
   591  	// try deleting id record after request creation
   592  	reqId, err = app.CustomGovKeeper.RequestIdentityRecordsVerify(ctx, addr2, addr3, []uint64{2}, sdk.NewInt64Coin(appparams.DefaultDenom, 200))
   593  	require.Equal(t, reqId, uint64(9))
   594  	app.CustomGovKeeper.DeleteIdentityRecords(ctx, addr2, []string{})
   595  	cacheCtx, _ = ctx.CacheContext()
   596  	err = app.CustomGovKeeper.HandleIdentityRecordsVerifyRequest(cacheCtx, addr3, 9, true)
   597  	require.Error(t, err)
   598  }