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 }