Module diem.testing.miniwallet.config
Expand source code
# Copyright (c) The Diem Core Contributors
# SPDX-License-Identifier: Apache-2.0
from dataclasses import dataclass, field, asdict
from typing import Dict, Any, List, Tuple
from .client import RestClient
from .app import App, falcon_api
from .. import LocalAccount
from ... import offchain, testnet, jsonrpc, utils
import waitress, threading, logging, falcon, json
@dataclass
class ServerConfig:
host: str = field(default="localhost")
port: int = field(default_factory=offchain.http_server.get_available_port)
base_url: str = field(default="")
def __post_init__(self) -> None:
if not self.base_url:
self.base_url = f"http://localhost:{self.port}"
@dataclass
class AppConfig:
name: str = field(default="mini-wallet")
disable_events_api: bool = field(default=False)
account_config: Dict[str, Any] = field(default_factory=lambda: LocalAccount().to_dict())
child_account_configs: List[Dict[str, Any]] = field(default_factory=list)
server_conf: ServerConfig = field(default_factory=ServerConfig)
initial_amount: int = field(default=3_000_000_000_000)
initial_currency: str = field(default=testnet.TEST_CURRENCY_CODE)
child_account_size: int = field(default=2)
@property
def logger(self) -> logging.Logger:
return logging.getLogger(self.name)
@property
def account(self) -> LocalAccount:
return LocalAccount.from_dict(self.account_config)
@property
def child_accounts(self) -> List[LocalAccount]:
return list(map(LocalAccount.from_dict, self.child_account_configs))
@property
def server_url(self) -> str:
return self.server_conf.base_url
def create_client(self) -> RestClient:
self.logger.info("Creating client pointing to %s", self.server_url)
return RestClient(server_url=self.server_url, name="%s-client" % self.name).with_retry()
def setup_account(self, client: jsonrpc.Client) -> None:
self.logger.info("faucet: mint %s", self.account.account_address.to_hex())
faucet = testnet.Faucet(client)
faucet.mint(self.account.auth_key.hex(), self.initial_amount, self.initial_currency)
self.logger.info("rotate dual attestation info for %s", self.account.account_address.to_hex())
self.logger.info("set base url to: %s", self.server_url)
self.account.rotate_dual_attestation_info(client, self.server_url)
self.logger.info("generate child VASP accounts: %s", self.child_account_size)
child_account_initial_amount = int(self.initial_amount / (self.child_account_size + 1))
for i in range(self.child_account_size):
child = self.account.gen_child_vasp(client, child_account_initial_amount, self.initial_currency)
self.logger.info("generate child VASP account(%s): %s", i, child.to_dict())
self.child_account_configs.append(child.to_dict())
def serve(self, client: jsonrpc.Client, app: App) -> threading.Thread:
api: falcon.API = falcon_api(app, self.disable_events_api)
def serve() -> None:
self.logger.info("serving on %s:%s at %s", self.server_conf.host, self.server_conf.port, self.server_url)
waitress.serve(
api,
host=self.server_conf.host,
port=self.server_conf.port,
clear_untrusted_proxy_headers=True,
_quiet=True,
)
t = threading.Thread(target=serve, daemon=True)
t.start()
return t
def start(self, client: jsonrpc.Client) -> Tuple[App, threading.Thread]:
self.setup_account(client)
app = App(self.account, self.child_accounts, client, self.name, self.logger)
t = self.serve(client, app)
utils.wait_for_port(self.server_conf.port, host=self.server_conf.host)
return (app, t)
def __str__(self) -> str:
return json.dumps(asdict(self), indent=2)
Classes
class AppConfig (name: str = 'mini-wallet', disable_events_api: bool = False, account_config: Dict[str, Any] = <factory>, child_account_configs: List[Dict[str, Any]] = <factory>, server_conf: ServerConfig = <factory>, initial_amount: int = 3000000000000, initial_currency: str = 'XUS', child_account_size: int = 2)
-
AppConfig(name: str = 'mini-wallet', disable_events_api: bool = False, account_config: Dict[str, Any] =
, child_account_configs: List[Dict[str, Any]] = , server_conf: diem.testing.miniwallet.config.ServerConfig = , initial_amount: int = 3000000000000, initial_currency: str = 'XUS', child_account_size: int = 2) Expand source code
@dataclass class AppConfig: name: str = field(default="mini-wallet") disable_events_api: bool = field(default=False) account_config: Dict[str, Any] = field(default_factory=lambda: LocalAccount().to_dict()) child_account_configs: List[Dict[str, Any]] = field(default_factory=list) server_conf: ServerConfig = field(default_factory=ServerConfig) initial_amount: int = field(default=3_000_000_000_000) initial_currency: str = field(default=testnet.TEST_CURRENCY_CODE) child_account_size: int = field(default=2) @property def logger(self) -> logging.Logger: return logging.getLogger(self.name) @property def account(self) -> LocalAccount: return LocalAccount.from_dict(self.account_config) @property def child_accounts(self) -> List[LocalAccount]: return list(map(LocalAccount.from_dict, self.child_account_configs)) @property def server_url(self) -> str: return self.server_conf.base_url def create_client(self) -> RestClient: self.logger.info("Creating client pointing to %s", self.server_url) return RestClient(server_url=self.server_url, name="%s-client" % self.name).with_retry() def setup_account(self, client: jsonrpc.Client) -> None: self.logger.info("faucet: mint %s", self.account.account_address.to_hex()) faucet = testnet.Faucet(client) faucet.mint(self.account.auth_key.hex(), self.initial_amount, self.initial_currency) self.logger.info("rotate dual attestation info for %s", self.account.account_address.to_hex()) self.logger.info("set base url to: %s", self.server_url) self.account.rotate_dual_attestation_info(client, self.server_url) self.logger.info("generate child VASP accounts: %s", self.child_account_size) child_account_initial_amount = int(self.initial_amount / (self.child_account_size + 1)) for i in range(self.child_account_size): child = self.account.gen_child_vasp(client, child_account_initial_amount, self.initial_currency) self.logger.info("generate child VASP account(%s): %s", i, child.to_dict()) self.child_account_configs.append(child.to_dict()) def serve(self, client: jsonrpc.Client, app: App) -> threading.Thread: api: falcon.API = falcon_api(app, self.disable_events_api) def serve() -> None: self.logger.info("serving on %s:%s at %s", self.server_conf.host, self.server_conf.port, self.server_url) waitress.serve( api, host=self.server_conf.host, port=self.server_conf.port, clear_untrusted_proxy_headers=True, _quiet=True, ) t = threading.Thread(target=serve, daemon=True) t.start() return t def start(self, client: jsonrpc.Client) -> Tuple[App, threading.Thread]: self.setup_account(client) app = App(self.account, self.child_accounts, client, self.name, self.logger) t = self.serve(client, app) utils.wait_for_port(self.server_conf.port, host=self.server_conf.host) return (app, t) def __str__(self) -> str: return json.dumps(asdict(self), indent=2)
Class variables
var account_config : Dict[str, Any]
var child_account_configs : List[Dict[str, Any]]
var child_account_size : int
var disable_events_api : bool
var initial_amount : int
var initial_currency : str
var name : str
var server_conf : ServerConfig
Instance variables
var account : LocalAccount
-
Expand source code
@property def account(self) -> LocalAccount: return LocalAccount.from_dict(self.account_config)
var child_accounts : List[LocalAccount]
-
Expand source code
@property def child_accounts(self) -> List[LocalAccount]: return list(map(LocalAccount.from_dict, self.child_account_configs))
var logger : logging.Logger
-
Expand source code
@property def logger(self) -> logging.Logger: return logging.getLogger(self.name)
var server_url : str
-
Expand source code
@property def server_url(self) -> str: return self.server_conf.base_url
Methods
def create_client(self) ‑> RestClient
-
Expand source code
def create_client(self) -> RestClient: self.logger.info("Creating client pointing to %s", self.server_url) return RestClient(server_url=self.server_url, name="%s-client" % self.name).with_retry()
def serve(self, client: Client, app: App) ‑> threading.Thread
-
Expand source code
def serve(self, client: jsonrpc.Client, app: App) -> threading.Thread: api: falcon.API = falcon_api(app, self.disable_events_api) def serve() -> None: self.logger.info("serving on %s:%s at %s", self.server_conf.host, self.server_conf.port, self.server_url) waitress.serve( api, host=self.server_conf.host, port=self.server_conf.port, clear_untrusted_proxy_headers=True, _quiet=True, ) t = threading.Thread(target=serve, daemon=True) t.start() return t
def setup_account(self, client: Client) ‑> NoneType
-
Expand source code
def setup_account(self, client: jsonrpc.Client) -> None: self.logger.info("faucet: mint %s", self.account.account_address.to_hex()) faucet = testnet.Faucet(client) faucet.mint(self.account.auth_key.hex(), self.initial_amount, self.initial_currency) self.logger.info("rotate dual attestation info for %s", self.account.account_address.to_hex()) self.logger.info("set base url to: %s", self.server_url) self.account.rotate_dual_attestation_info(client, self.server_url) self.logger.info("generate child VASP accounts: %s", self.child_account_size) child_account_initial_amount = int(self.initial_amount / (self.child_account_size + 1)) for i in range(self.child_account_size): child = self.account.gen_child_vasp(client, child_account_initial_amount, self.initial_currency) self.logger.info("generate child VASP account(%s): %s", i, child.to_dict()) self.child_account_configs.append(child.to_dict())
def start(self, client: Client) ‑> Tuple[App, threading.Thread]
-
Expand source code
def start(self, client: jsonrpc.Client) -> Tuple[App, threading.Thread]: self.setup_account(client) app = App(self.account, self.child_accounts, client, self.name, self.logger) t = self.serve(client, app) utils.wait_for_port(self.server_conf.port, host=self.server_conf.host) return (app, t)
class ServerConfig (host: str = 'localhost', port: int = <factory>, base_url: str = '')
-
ServerConfig(host: str = 'localhost', port: int =
, base_url: str = '') Expand source code
@dataclass class ServerConfig: host: str = field(default="localhost") port: int = field(default_factory=offchain.http_server.get_available_port) base_url: str = field(default="") def __post_init__(self) -> None: if not self.base_url: self.base_url = f"http://localhost:{self.port}"
Class variables
var base_url : str
var host : str
var port : int