github.com/cosmos/cosmos-sdk@v0.50.10/x/auth/types/credentials.go (about) 1 package types 2 3 import ( 4 "bytes" 5 "fmt" 6 7 cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" 8 sdk "github.com/cosmos/cosmos-sdk/types" 9 "github.com/cosmos/cosmos-sdk/types/address" 10 ) 11 12 // NewBaseAccountWithPubKey creates an account with an a pubkey. 13 func NewBaseAccountWithPubKey(pubkey cryptotypes.PubKey) (*BaseAccount, error) { 14 if pubkey == nil { 15 return nil, fmt.Errorf("pubkey cannot be nil") 16 } 17 18 baseAccount := NewBaseAccountWithAddress(sdk.AccAddress(pubkey.Address())) 19 if err := baseAccount.SetPubKey(pubkey); err != nil { 20 return nil, fmt.Errorf("failed to create a valid account with credentials: %w", err) 21 } 22 23 if err := baseAccount.Validate(); err != nil { 24 return nil, fmt.Errorf("failed to create a valid account with credentials: %w", err) 25 } 26 27 return baseAccount, nil 28 } 29 30 const ModuleCredentialType = "ModuleCredential" 31 32 var _ cryptotypes.PubKey = &ModuleCredential{} 33 34 // NewModuleCredential creates new module credential key. 35 // All derivation keys must be non-empty. 36 func NewModuleCredential(moduleName string, derivationKeys ...[]byte) (*ModuleCredential, error) { 37 for i := range derivationKeys { 38 if len(derivationKeys[i]) == 0 { 39 return nil, fmt.Errorf("module credential derivation keys at index %d is empty", i) 40 } 41 } 42 return &ModuleCredential{ 43 ModuleName: moduleName, 44 DerivationKeys: derivationKeys, 45 }, nil 46 } 47 48 func (m *ModuleCredential) Address() cryptotypes.Address { 49 return address.Module(m.ModuleName, m.DerivationKeys...) 50 } 51 52 func (m *ModuleCredential) Bytes() []byte { 53 return nil 54 } 55 56 // VerifySignature returns always false, making the account unclaimable 57 func (m *ModuleCredential) VerifySignature(_, _ []byte) bool { 58 return false 59 } 60 61 func (m *ModuleCredential) Equals(other cryptotypes.PubKey) bool { 62 om, ok := other.(*ModuleCredential) 63 if !ok { 64 return false 65 } 66 67 if m.ModuleName != om.ModuleName { 68 return false 69 } 70 71 if len(m.DerivationKeys) != len(om.DerivationKeys) { 72 return false 73 } 74 75 for i := range m.DerivationKeys { 76 if !bytes.Equal(m.DerivationKeys[i], om.DerivationKeys[i]) { 77 return false 78 } 79 } 80 81 return true 82 } 83 84 func (m *ModuleCredential) Type() string { 85 return ModuleCredentialType 86 }