Source code for aries_cloudagent.config.wallet

"""Wallet configuration."""

import logging
from typing import Tuple

from ..core.error import ProfileNotFoundError
from ..core.profile import Profile, ProfileManager
from ..wallet.base import BaseWallet
from ..wallet.did_info import DIDInfo
from ..wallet.crypto import seed_to_did
from ..wallet.key_type import KeyType
from ..wallet.did_method import DIDMethod

from .base import ConfigError
from .injection_context import InjectionContext

LOGGER = logging.getLogger(__name__)

CFG_MAP = {"key", "rekey", "name", "storage_config", "storage_creds", "storage_type"}


[docs]async def wallet_config( context: InjectionContext, provision: bool = False ) -> Tuple[Profile, DIDInfo]: """Initialize the root profile.""" mgr = context.inject(ProfileManager) settings = context.settings profile_cfg = {} for k in CFG_MAP: pk = f"wallet.{k}" if pk in settings: profile_cfg[k] = settings[pk] # may be set by `aca-py provision --recreate` if settings.get("wallet.recreate"): profile_cfg["auto_recreate"] = True if provision: profile = await mgr.provision(context, profile_cfg) else: try: profile = await mgr.open(context, profile_cfg) except ProfileNotFoundError: if settings.get("auto_provision", False): profile = await mgr.provision(context, profile_cfg) else: raise if provision: if profile.created: print("Created new profile") else: print("Opened existing profile") print("Profile backend:", profile.backend) print("Profile name:", profile.name) wallet_seed = context.settings.get("wallet.seed") wallet_local_did = context.settings.get("wallet.local_did") txn = await profile.transaction() wallet = txn.inject(BaseWallet) public_did_info = await wallet.get_public_did() public_did = None if public_did_info: public_did = public_did_info.did if wallet_seed and seed_to_did(wallet_seed) != public_did: if context.settings.get("wallet.replace_public_did"): replace_did_info = await wallet.create_local_did( method=DIDMethod.SOV, key_type=KeyType.ED25519, seed=wallet_seed ) public_did = replace_did_info.did await wallet.set_public_did(public_did) print(f"Created new public DID: {public_did}") print(f"Verkey: {replace_did_info.verkey}") else: # If we already have a registered public did and it doesn't match # the one derived from `wallet_seed` then we error out. raise ConfigError( "New seed provided which doesn't match the registered" + f" public did {public_did}" ) # wait until ledger config to set public DID endpoint - wallet goes first elif wallet_seed: if wallet_local_did: endpoint = context.settings.get("default_endpoint") metadata = {"endpoint": endpoint} if endpoint else None local_did_info = await wallet.create_local_did( method=DIDMethod.SOV, key_type=KeyType.ED25519, seed=wallet_seed, metadata=metadata, ) local_did = local_did_info.did if provision: print(f"Created new local DID: {local_did}") print(f"Verkey: {local_did_info.verkey}") else: public_did_info = await wallet.create_public_did( method=DIDMethod.SOV, key_type=KeyType.ED25519, seed=wallet_seed ) public_did = public_did_info.did if provision: print(f"Created new public DID: {public_did}") print(f"Verkey: {public_did_info.verkey}") # wait until ledger config to set public DID endpoint - wallet goes first if provision and not wallet_local_did and not public_did: print("No public DID") # Debug settings test_seed = context.settings.get("debug.seed") if context.settings.get("debug.enabled"): if not test_seed: test_seed = "testseed000000000000000000000001" if test_seed: await wallet.create_local_did( method=DIDMethod.SOV, key_type=KeyType.ED25519, seed=test_seed, metadata={"endpoint": "1.2.3.4:8021"}, ) await txn.commit() return (profile, public_did_info)