def _spawn_context( self, shell: Optional[Union[ShellQuery, str]] = None, key: Optional[Union[Key, str, dict]] = None, address: Optional[str] = None, block_id: Optional[Union[str, int]] = None, mode: Optional[str] = None, script: Optional[dict] = None, ipfs_gateway: Optional[str] = None, ) -> ExecutionContext: if isinstance(shell, str): if shell.endswith('.pool'): shell = shell.split('.')[0] assert shell in nodes, f'unknown network {shell}' shell = ShellQuery(RpcMultiNode(nodes[shell])) elif shell in nodes: shell = ShellQuery(RpcNode(nodes[shell][0])) else: shell = ShellQuery(RpcNode(shell)) else: assert shell is None or isinstance( shell, ShellQuery), f'unexpected shell {shell}' if isinstance(key, str): if key in keys: key = Key.from_encoded_key(keys[key]) elif is_public_key(key): key = Key.from_encoded_key(key) elif is_pkh(key): key = KeyHash(key) elif exists(expanduser(key)): key = Key.from_faucet(key) else: key = Key.from_alias(key) elif isinstance(key, dict): key = Key.from_faucet(key) else: assert key is None or isinstance(key, Key), f'unexpected key {key}' if isinstance(address, str): try: script = self.shell.contracts[address].script() except RpcError as e: raise RpcError(f'Contract {address} not found', *e.args) from e return ExecutionContext( shell=shell or self.context.shell, key=key or self.context.key, address=address, block_id=block_id, script=script or self.context.script, mode=mode or self.context.mode, ipfs_gateway=ipfs_gateway, )
def from_value(cls, value: str) -> 'KeyType': assert is_public_key( value), f'expected ed/sp/p2 public key, got {value}' return cls(value)