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  }