From 9c26f11ddeabd48524f924ce3332947349d7aea3 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 20 Mar 2023 12:56:18 -0400 Subject: [PATCH 01/12] get initial prod config file up --- xbridge_cli/server/config/__init__.py | 11 ++ xbridge_cli/server/config/config.py | 18 ++ xbridge_cli/server/config/prod_config.py | 158 ++++++++++++++++++ .../server/config/templates/witness.jinja | 4 + 4 files changed, 191 insertions(+) create mode 100644 xbridge_cli/server/config/prod_config.py diff --git a/xbridge_cli/server/config/__init__.py b/xbridge_cli/server/config/__init__.py index acace85f..2263b3a5 100644 --- a/xbridge_cli/server/config/__init__.py +++ b/xbridge_cli/server/config/__init__.py @@ -7,6 +7,16 @@ generate_bootstrap, generate_witness_config, ) +from xbridge_cli.server.config.prod_config import generate_prod_witness_config + + +@click.group(name="prod") +def create_prod_server_configs() -> None: + """Subcommand for production server config file generation.""" + pass + + +create_prod_server_configs.add_command(generate_prod_witness_config, name="witness") @click.group(name="create-config") @@ -18,5 +28,6 @@ def create_server_configs() -> None: create_server_configs.add_command(generate_all_configs, name="all") create_server_configs.add_command(generate_bootstrap, name="bootstrap") create_server_configs.add_command(generate_witness_config, name="witness") +create_server_configs.add_command(create_prod_server_configs, name="prod") __all__ = ["create_server_configs"] diff --git a/xbridge_cli/server/config/config.py b/xbridge_cli/server/config/config.py index 1bce80a3..15e8c5fc 100644 --- a/xbridge_cli/server/config/config.py +++ b/xbridge_cli/server/config/config.py @@ -126,6 +126,13 @@ def _generate_rippled_configs(config_dir: str, docker: bool = False) -> Tuple[in is_flag=True, help="Whether the config files are for a docker setup.", ) +@click.option( + "--locking_ip", + "locking_chain_ip", + default="127.0.0.1", + type=str, + help="The IP address of the locking chain node.", +) @click.option( "--locking_port", "locking_chain_port", @@ -134,6 +141,13 @@ def _generate_rippled_configs(config_dir: str, docker: bool = False) -> Tuple[in type=int, help="The port used by the locking chain.", ) +@click.option( + "--issuing_ip", + "issuing_chain_ip", + default="127.0.0.1", + type=str, + help="The IP address of the issuing chain node.", +) @click.option( "--issuing_port", "issuing_chain_port", @@ -215,7 +229,9 @@ def _generate_rippled_configs(config_dir: str, docker: bool = False) -> Tuple[in def generate_witness_config( config_dir: str, name: str, + locking_chain_ip: str, locking_chain_port: int, + issuing_chain_ip: str, issuing_chain_port: int, witness_port: int, locking_reward_seed: str, @@ -281,7 +297,9 @@ def generate_witness_config( log_file = os.path.join(sub_dir, "witness.log") template_data = { + "locking_chain_ip": locking_chain_ip, "locking_chain_port": locking_chain_port, + "issuing_chain_ip": issuing_chain_ip, "issuing_chain_port": issuing_chain_port, "witness_port": witness_port, "db_dir": os.path.join(sub_dir, "db"), diff --git a/xbridge_cli/server/config/prod_config.py b/xbridge_cli/server/config/prod_config.py new file mode 100644 index 00000000..d0f780b7 --- /dev/null +++ b/xbridge_cli/server/config/prod_config.py @@ -0,0 +1,158 @@ +"""Prod config generation.""" +import os +from sys import platform + +import click + +from xbridge_cli.server.config.config import _generate_template, _get_currency + + +@click.command(name="witness") +@click.option( + "-c", + "--config_path", + default="./witness.json", + prompt=True, + type=click.Path(), + help="The location in which to store this config file.", +) +@click.option( + "--locking", + "locking_chain", + required=True, + prompt="Locking Chain (IP:WS Port)", + type=str, + help=( + "The address of the locking chain node's Websocket port, of the form " + "`IP:Port`." + ), +) +@click.option( + "--issuing", + "issuing_chain", + required=True, + prompt="Issuing Chain (IP:WS Port)", + type=str, + help=( + "The address of the issuing chain node's Websocket port, of the form " + "`IP:Port`." + ), +) +@click.option( + "--rpc_port", + default="6006", + prompt=True, + type=int, + help="The port that will be used by the witness server for RPC commands.", +) +@click.option( + "--locking_door", + required=True, + prompt=True, + help="The door account on the locking chain.", +) +@click.option( + "--locking_currency", + default="XRP", + prompt=True, + help=( + "The currency on the locking chain. Defaults to XRP. An issued currency is of " + "the form `{{currency}}.{{issue}}`" + ), +) +@click.option( + "--issuing_door", + default="rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + prompt=True, + help="The door account on the issuing chain. Defaults to the genesis account.", +) +@click.option( + "--signing_seed", + required=True, + prompt=True, + help="The seed to use for signing attestations.", +) +@click.option( + "--locking_reward_seed", + required=True, + prompt=True, + help="The seed for the reward account for the witness on the locking chain.", +) +@click.option( + "--locking_reward_account", + required=True, + prompt=True, + help="The reward account for the witness on the locking chain.", +) +@click.option( + "--issuing_reward_seed", + required=True, + prompt=True, + help="The seed for the reward account for the witness on the issuing chain.", +) +@click.option( + "--issuing_reward_account", + required=True, + prompt=True, + help="The reward account for the witness on the issuing chain.", +) +@click.option( + "-v", + "--verbose", + is_flag=True, + help="Whether or not to print more verbose information.", +) +def generate_prod_witness_config( + config_path: str, + locking_chain: str, + issuing_chain: str, + rpc_port: int, + locking_reward_seed: str, + locking_reward_account: str, + issuing_reward_seed: str, + issuing_reward_account: str, + locking_door: str, + signing_seed: str, + locking_currency: str = "XRP", + issuing_door: str = "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + verbose: bool = False, +) -> None: + abs_config_path = os.path.abspath(config_path) + sub_dir = "/opt/witness" + + locking_chain_ip, locking_chain_port = locking_chain.split(":") + issuing_chain_ip, issuing_chain_port = issuing_chain.split(":") + + locking_issue = _get_currency(locking_currency) + issuing_issue = locking_issue.copy() + if issuing_issue["currency"] != "XRP": + issuing_issue["issuer"] = issuing_door + + log_file = os.path.join(os.path.dirname(abs_config_path), "witness.log") + + template_data = { + "locking_chain_ip": locking_chain_ip, + "locking_chain_port": locking_chain_port, + "issuing_chain_ip": issuing_chain_ip, + "issuing_chain_port": issuing_chain_port, + "witness_port": rpc_port, + "db_dir": os.path.join(sub_dir, "db"), + "seed": signing_seed, + "locking_reward_seed": locking_reward_seed, + "locking_reward_account": locking_reward_account, + "issuing_reward_seed": issuing_reward_seed, + "issuing_reward_account": issuing_reward_account, + "src_door": locking_door, + "src_issue": repr(locking_issue).replace("'", '"'), + "dst_door": issuing_door, + "dst_issue": repr(issuing_issue).replace("'", '"'), + "is_linux": platform == "linux" or platform == "linux2", + "is_docker": False, + "log_file": log_file, + } + + if verbose: + click.echo(template_data) + + # add the witness.json file + _generate_template("witness.jinja", template_data, abs_config_path) diff --git a/xbridge_cli/server/config/templates/witness.jinja b/xbridge_cli/server/config/templates/witness.jinja index 8884a235..ed495a8f 100644 --- a/xbridge_cli/server/config/templates/witness.jinja +++ b/xbridge_cli/server/config/templates/witness.jinja @@ -3,6 +3,8 @@ "Endpoint": { {% if is_docker %} "Host": "192.168.176.2", + {% elif locking_chain_ip %} + "Host": "{{ locking_chain_ip }}", {% else %} "Host": "127.0.0.1", {% endif %} @@ -22,6 +24,8 @@ "Host": "192.168.176.3", {% elif is_linux %} "Host": "127.0.0.2", + {% elif issuing_chain_ip %} + "Host": "{{ issuing_chain_ip }}", {% else %} "Host": "127.0.0.1", {% endif %} From 5f7d60830858e5770efd47a80211024ce412fb11 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 21 Mar 2023 14:15:11 -0400 Subject: [PATCH 02/12] add auto-generate option for signing seed --- xbridge_cli/server/config/prod_config.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/xbridge_cli/server/config/prod_config.py b/xbridge_cli/server/config/prod_config.py index d0f780b7..78535bc2 100644 --- a/xbridge_cli/server/config/prod_config.py +++ b/xbridge_cli/server/config/prod_config.py @@ -1,8 +1,10 @@ """Prod config generation.""" import os from sys import platform +from typing import Optional import click +from xrpl.wallet import Wallet from xbridge_cli.server.config.config import _generate_template, _get_currency @@ -68,8 +70,9 @@ ) @click.option( "--signing_seed", - required=True, - prompt=True, + "signing_seed_param", + prompt="Signing Seed (leave blank to auto-generate)", + default=None, help="The seed to use for signing attestations.", ) @click.option( @@ -112,7 +115,7 @@ def generate_prod_witness_config( issuing_reward_seed: str, issuing_reward_account: str, locking_door: str, - signing_seed: str, + signing_seed_param: Optional[str] = None, locking_currency: str = "XRP", issuing_door: str = "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", verbose: bool = False, @@ -123,6 +126,11 @@ def generate_prod_witness_config( locking_chain_ip, locking_chain_port = locking_chain.split(":") issuing_chain_ip, issuing_chain_port = issuing_chain.split(":") + if signing_seed_param is None: + signing_seed = Wallet.create().seed + else: + signing_seed = signing_seed_param + locking_issue = _get_currency(locking_currency) issuing_issue = locking_issue.copy() if issuing_issue["currency"] != "XRP": From 0422c0d13915af31eb44c70e50c533868d35b78f Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 21 Mar 2023 14:16:42 -0400 Subject: [PATCH 03/12] fix issuing endpoint for linux --- xbridge_cli/server/config/templates/witness.jinja | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xbridge_cli/server/config/templates/witness.jinja b/xbridge_cli/server/config/templates/witness.jinja index ed495a8f..f6f12b14 100644 --- a/xbridge_cli/server/config/templates/witness.jinja +++ b/xbridge_cli/server/config/templates/witness.jinja @@ -22,10 +22,10 @@ "Endpoint": { {% if is_docker %} "Host": "192.168.176.3", - {% elif is_linux %} - "Host": "127.0.0.2", {% elif issuing_chain_ip %} "Host": "{{ issuing_chain_ip }}", + {% elif is_linux %} + "Host": "127.0.0.2", {% else %} "Host": "127.0.0.1", {% endif %} From 69f6f74aaa54dd15aa68bfba827f06d2b9a20037 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 21 Mar 2023 14:25:56 -0400 Subject: [PATCH 04/12] fix unable to leave blank for seed --- xbridge_cli/server/config/prod_config.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/xbridge_cli/server/config/prod_config.py b/xbridge_cli/server/config/prod_config.py index 78535bc2..de6f7409 100644 --- a/xbridge_cli/server/config/prod_config.py +++ b/xbridge_cli/server/config/prod_config.py @@ -72,7 +72,7 @@ "--signing_seed", "signing_seed_param", prompt="Signing Seed (leave blank to auto-generate)", - default=None, + default="", help="The seed to use for signing attestations.", ) @click.option( @@ -115,7 +115,7 @@ def generate_prod_witness_config( issuing_reward_seed: str, issuing_reward_account: str, locking_door: str, - signing_seed_param: Optional[str] = None, + signing_seed_param: str = "", locking_currency: str = "XRP", issuing_door: str = "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", verbose: bool = False, @@ -126,7 +126,7 @@ def generate_prod_witness_config( locking_chain_ip, locking_chain_port = locking_chain.split(":") issuing_chain_ip, issuing_chain_port = issuing_chain.split(":") - if signing_seed_param is None: + if signing_seed_param == "": signing_seed = Wallet.create().seed else: signing_seed = signing_seed_param From 45cf06d143dae3c4a087a71a31dce3cd7ae80a8e Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 21 Mar 2023 14:35:47 -0400 Subject: [PATCH 05/12] fix imports --- xbridge_cli/server/config/prod_config.py | 1 - 1 file changed, 1 deletion(-) diff --git a/xbridge_cli/server/config/prod_config.py b/xbridge_cli/server/config/prod_config.py index de6f7409..ec3e1935 100644 --- a/xbridge_cli/server/config/prod_config.py +++ b/xbridge_cli/server/config/prod_config.py @@ -1,7 +1,6 @@ """Prod config generation.""" import os from sys import platform -from typing import Optional import click from xrpl.wallet import Wallet From f6c5c62d9d6fa50237b4265353eae740dba8c80a Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 21 Mar 2023 14:48:17 -0400 Subject: [PATCH 06/12] add docstring --- .darglint | 2 +- .flake8 | 3 ++- xbridge_cli/server/config/config.py | 2 ++ xbridge_cli/server/config/prod_config.py | 1 + 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.darglint b/.darglint index cdc16584..5b972259 100644 --- a/.darglint +++ b/.darglint @@ -1,4 +1,4 @@ [darglint] # Disable darglint checks for private functions. ignore_regex=^_(.*) -ignore=DAR402 +ignore=DAR402,DAR101 diff --git a/.flake8 b/.flake8 index 87bd1ef4..24e791bb 100644 --- a/.flake8 +++ b/.flake8 @@ -5,7 +5,8 @@ docstring-convention=google # D212 and D213 are mutually exclusive, so we're only allowing D213. # D205 and D415 don't like multi-line summary statements, which is annoying. # E203 and W503 don't interact well with black -ignore = D205,D212,D415,E203,W503 +# D417 asks for params in the docstring - it's not necessary because of Click +ignore = D205,D212,D415,E203,W503,D417 # This is the line length that black uses # https://black.readthedocs.io/en/stable/the_black_code_style.html#line-length diff --git a/xbridge_cli/server/config/config.py b/xbridge_cli/server/config/config.py index 15e8c5fc..9f3a43f4 100644 --- a/xbridge_cli/server/config/config.py +++ b/xbridge_cli/server/config/config.py @@ -253,6 +253,8 @@ def generate_witness_config( Args: config_dir: The folder in which to store config files. name: The name of the witness server. + locking_chain_ip: The IP address of the locking chain node. + issuing_chain_ip: The IP address of the issuing chain node. locking_chain_port: The port used by the locking chain. issuing_chain_port: The port used by the issuing chain. witness_port: The port that will be used by the witness server. diff --git a/xbridge_cli/server/config/prod_config.py b/xbridge_cli/server/config/prod_config.py index ec3e1935..6d77d9da 100644 --- a/xbridge_cli/server/config/prod_config.py +++ b/xbridge_cli/server/config/prod_config.py @@ -119,6 +119,7 @@ def generate_prod_witness_config( issuing_door: str = "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", verbose: bool = False, ) -> None: + """Generate the config file for a production witness server.""" abs_config_path = os.path.abspath(config_path) sub_dir = "/opt/witness" From f24347c6e5b35790a5fc6abb27e64c1551e96ddc Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 21 Mar 2023 15:17:46 -0400 Subject: [PATCH 07/12] move everything to a prod folder --- xbridge_cli/server/config/__init__.py | 11 +---------- xbridge_cli/server/config/prod/__init__.py | 16 ++++++++++++++++ .../config/{prod_config.py => prod/witness.py} | 0 3 files changed, 17 insertions(+), 10 deletions(-) create mode 100644 xbridge_cli/server/config/prod/__init__.py rename xbridge_cli/server/config/{prod_config.py => prod/witness.py} (100%) diff --git a/xbridge_cli/server/config/__init__.py b/xbridge_cli/server/config/__init__.py index 2263b3a5..c328525b 100644 --- a/xbridge_cli/server/config/__init__.py +++ b/xbridge_cli/server/config/__init__.py @@ -7,16 +7,7 @@ generate_bootstrap, generate_witness_config, ) -from xbridge_cli.server.config.prod_config import generate_prod_witness_config - - -@click.group(name="prod") -def create_prod_server_configs() -> None: - """Subcommand for production server config file generation.""" - pass - - -create_prod_server_configs.add_command(generate_prod_witness_config, name="witness") +from xbridge_cli.server.config.prod import create_prod_server_configs @click.group(name="create-config") diff --git a/xbridge_cli/server/config/prod/__init__.py b/xbridge_cli/server/config/prod/__init__.py new file mode 100644 index 00000000..d82b73eb --- /dev/null +++ b/xbridge_cli/server/config/prod/__init__.py @@ -0,0 +1,16 @@ +"""Subcommand for all commands dealing with production server config file generation.""" + +import click + +from xbridge_cli.server.config.prod.witness import generate_prod_witness_config + + +@click.group(name="prod") +def create_prod_server_configs() -> None: + """Subcommand for production server config file generation.""" + pass + + +create_prod_server_configs.add_command(generate_prod_witness_config, name="witness") + +__all__ = ["create_prod_server_configs"] diff --git a/xbridge_cli/server/config/prod_config.py b/xbridge_cli/server/config/prod/witness.py similarity index 100% rename from xbridge_cli/server/config/prod_config.py rename to xbridge_cli/server/config/prod/witness.py From c9a838b79479025cefff8c87f8c7aaf30294f85e Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 22 Mar 2023 17:56:01 -0400 Subject: [PATCH 08/12] switch auto-gen seed type --- xbridge_cli/server/config/prod/witness.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xbridge_cli/server/config/prod/witness.py b/xbridge_cli/server/config/prod/witness.py index 6d77d9da..5aa48e69 100644 --- a/xbridge_cli/server/config/prod/witness.py +++ b/xbridge_cli/server/config/prod/witness.py @@ -3,6 +3,7 @@ from sys import platform import click +from xrpl import CryptoAlgorithm from xrpl.wallet import Wallet from xbridge_cli.server.config.config import _generate_template, _get_currency @@ -127,7 +128,7 @@ def generate_prod_witness_config( issuing_chain_ip, issuing_chain_port = issuing_chain.split(":") if signing_seed_param == "": - signing_seed = Wallet.create().seed + signing_seed = Wallet.create(crypto_algorithm=CryptoAlgorithm.SECP256K1).seed else: signing_seed = signing_seed_param From 4e93e136e26d0928704b71146a5b9017e85574a4 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 21 Mar 2023 15:56:59 -0400 Subject: [PATCH 09/12] add prod bootstrap files --- xbridge_cli/server/config/prod/__init__.py | 8 + xbridge_cli/server/config/prod/bootstrap.py | 150 ++++++++++++++++++ .../config/templates/bootstrap-witness.jinja | 11 ++ 3 files changed, 169 insertions(+) create mode 100644 xbridge_cli/server/config/prod/bootstrap.py create mode 100644 xbridge_cli/server/config/templates/bootstrap-witness.jinja diff --git a/xbridge_cli/server/config/prod/__init__.py b/xbridge_cli/server/config/prod/__init__.py index d82b73eb..84d18973 100644 --- a/xbridge_cli/server/config/prod/__init__.py +++ b/xbridge_cli/server/config/prod/__init__.py @@ -2,6 +2,10 @@ import click +from xbridge_cli.server.config.prod.bootstrap import ( + combine_bootstrap_pieces, + get_bootstrap_piece_from_witness, +) from xbridge_cli.server.config.prod.witness import generate_prod_witness_config @@ -12,5 +16,9 @@ def create_prod_server_configs() -> None: create_prod_server_configs.add_command(generate_prod_witness_config, name="witness") +create_prod_server_configs.add_command( + get_bootstrap_piece_from_witness, name="bootstrap" +) +create_prod_server_configs.add_command(combine_bootstrap_pieces, name="combine") __all__ = ["create_prod_server_configs"] diff --git a/xbridge_cli/server/config/prod/bootstrap.py b/xbridge_cli/server/config/prod/bootstrap.py new file mode 100644 index 00000000..4b68b577 --- /dev/null +++ b/xbridge_cli/server/config/prod/bootstrap.py @@ -0,0 +1,150 @@ +"""Generate files related to a production bootstrap file.""" + +import json +import os +from sys import platform +from typing import List, Optional + +import click +from xrpl.wallet import Wallet + +from xbridge_cli.server.config.config import _generate_template + + +@click.command(name="bootstrap") +@click.option( + "-w", + "--witness_file", + required=True, + prompt=True, + type=click.Path(exists=True), + help="The location of the witness config file.", +) +@click.option( + "-o", + "--output_file", + prompt=True, + type=click.Path(), + help="The location of the witness config file.", +) +def get_bootstrap_piece_from_witness( + witness_file: str, output_file: Optional[str] = None +) -> None: + """ + Extract the info needed for the bootstrap file from a witness config file, without + revealing any secret information. + """ + with open(witness_file) as f: + witness_config = json.load(f) + + locking_config = witness_config["LockingChain"] + issuing_config = witness_config["IssuingChain"] + + locking_reward_account = locking_config["RewardAccount"] + locking_submit_account = locking_config["TxnSubmit"]["SubmittingAccount"] + issuing_reward_account = issuing_config["RewardAccount"] + issuing_submit_account = issuing_config["TxnSubmit"]["SubmittingAccount"] + signing_key_seed = witness_config["SigningKeySeed"] + # signing_key_algo = witness_config["SigningKeyType"] + signing_key_account = Wallet(signing_key_seed, 0).classic_address + + template_data = { + "locking_reward_account": locking_reward_account, + "locking_submit_account": locking_submit_account, + "issuing_reward_account": issuing_reward_account, + "issuing_submit_account": issuing_submit_account, + "signing_key_account": signing_key_account, + } + + # add the rippled.cfg file + _generate_template( + "bootstrap-witness.jinja", + template_data, + output_file or os.path.join(os.getcwd(), "bootstrap-witness.json"), + ) + + +@click.command(name="combine") +@click.option( + "-l", + "--locking_seed", + "locking_door_seed", + required=True, + prompt=True, + help="The seed of the locking chain's door account.", +) +@click.option( + "-i", + "--issuing_seed", + "issuing_door_seed", + required=True, + prompt=True, + help="The seed of the issuing chain's door account.", +) +@click.option( + "-b", + "--bootstrap_piece", + "bootstrap_pieces", + required=True, + multiple=True, + type=click.Path(exists=True), + help="One of the bootstrap pieces. Must include all of them here.", +) +def combine_bootstrap_pieces( + locking_door_seed: str, + issuing_door_seed: str, + bootstrap_pieces: List[str], +) -> None: + """Combine the bootstrap witness files into the bridge bootstrap file.""" + locking_reward_accounts = [] + locking_submit_accounts = [] + issuing_reward_accounts = [] + issuing_submit_accounts = [] + signing_accounts = [] + for bootstrap_piece in bootstrap_pieces: + with open(os.path.abspath(bootstrap_piece)) as f: + # print(f.readlines()) + bootstrap_config = json.load(f) + locking_reward_accounts.append( + bootstrap_config["LockingChain"]["RewardAccount"] + ) + locking_submit_accounts.append( + bootstrap_config["LockingChain"]["SubmitAccount"] + ) + issuing_reward_accounts.append( + bootstrap_config["IssuingChain"]["RewardAccount"] + ) + issuing_submit_accounts.append( + bootstrap_config["IssuingChain"]["SubmitAccount"] + ) + signing_accounts.append(bootstrap_config["SigningKeyAccount"]) + + locking_door = Wallet(locking_door_seed, 0) + issuing_door = Wallet(issuing_door_seed, 0) + locking_issue = "XRP" + issuing_issue = "XRP" + + template_data = { + "is_linux": platform == "linux" or platform == "linux2", + "locking_node_port": 5005, + "locking_door_account": locking_door.classic_address, + "locking_door_seed": locking_door.seed, + "locking_issue": repr(locking_issue).replace("'", '"'), + "locking_reward_accounts": locking_reward_accounts, + "locking_submit_accounts": locking_submit_accounts, + "issuing_node_port": 5006, + "issuing_door_account": issuing_door.classic_address, + "issuing_door_seed": issuing_door.seed, + "issuing_issue": repr(issuing_issue).replace("'", '"'), + "issuing_reward_accounts": issuing_reward_accounts, + "issuing_submit_accounts": issuing_reward_accounts, + "signing_accounts": signing_accounts, + } + # if verbose: + # click.echo(pformat(template_data)) + + _generate_template( + "bootstrap.jinja", + template_data, + os.path.join(os.getcwd(), "bridge_bootstrap.json"), + ) diff --git a/xbridge_cli/server/config/templates/bootstrap-witness.jinja b/xbridge_cli/server/config/templates/bootstrap-witness.jinja new file mode 100644 index 00000000..82420d27 --- /dev/null +++ b/xbridge_cli/server/config/templates/bootstrap-witness.jinja @@ -0,0 +1,11 @@ +{ + "LockingChain": { + "RewardAccount": "{{ locking_reward_account }}", + "SubmitAccount": "{{ locking_submit_account }}" + }, + "IssuingChain": { + "RewardAccount": "{{ issuing_reward_account }}", + "SubmitAccount": "{{ issuing_submit_account }}" + }, + "SigningKeyAccount": "{{ signing_key_account }}" +} From 086f5b5b5b13efd276727a22edfe300fe674a5d5 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 22 Mar 2023 18:21:25 -0400 Subject: [PATCH 10/12] add algo support for bootstrap-witness --- xbridge_cli/server/config/prod/bootstrap.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/xbridge_cli/server/config/prod/bootstrap.py b/xbridge_cli/server/config/prod/bootstrap.py index 4b68b577..cb0317ca 100644 --- a/xbridge_cli/server/config/prod/bootstrap.py +++ b/xbridge_cli/server/config/prod/bootstrap.py @@ -6,6 +6,7 @@ from typing import List, Optional import click +from xrpl import CryptoAlgorithm from xrpl.wallet import Wallet from xbridge_cli.server.config.config import _generate_template @@ -45,14 +46,17 @@ def get_bootstrap_piece_from_witness( issuing_reward_account = issuing_config["RewardAccount"] issuing_submit_account = issuing_config["TxnSubmit"]["SubmittingAccount"] signing_key_seed = witness_config["SigningKeySeed"] - # signing_key_algo = witness_config["SigningKeyType"] - signing_key_account = Wallet(signing_key_seed, 0).classic_address + signing_key_algo = CryptoAlgorithm(witness_config["SigningKeyType"].upper()) + signing_key_account = Wallet( + signing_key_seed, 0, algorithm=signing_key_algo + ).classic_address template_data = { "locking_reward_account": locking_reward_account, "locking_submit_account": locking_submit_account, "issuing_reward_account": issuing_reward_account, "issuing_submit_account": issuing_submit_account, + "signing_key_type": signing_key_algo.value, "signing_key_account": signing_key_account, } @@ -103,7 +107,6 @@ def combine_bootstrap_pieces( signing_accounts = [] for bootstrap_piece in bootstrap_pieces: with open(os.path.abspath(bootstrap_piece)) as f: - # print(f.readlines()) bootstrap_config = json.load(f) locking_reward_accounts.append( bootstrap_config["LockingChain"]["RewardAccount"] From 10b580fbef86224c2be85c66ce6816c9faf64b73 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 30 Oct 2023 16:50:47 -0400 Subject: [PATCH 11/12] fix xrpl-py 2.0 issues --- xbridge_cli/server/config/prod/bootstrap.py | 8 ++++---- xbridge_cli/server/config/prod/witness.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/xbridge_cli/server/config/prod/bootstrap.py b/xbridge_cli/server/config/prod/bootstrap.py index cb0317ca..b234840e 100644 --- a/xbridge_cli/server/config/prod/bootstrap.py +++ b/xbridge_cli/server/config/prod/bootstrap.py @@ -47,8 +47,8 @@ def get_bootstrap_piece_from_witness( issuing_submit_account = issuing_config["TxnSubmit"]["SubmittingAccount"] signing_key_seed = witness_config["SigningKeySeed"] signing_key_algo = CryptoAlgorithm(witness_config["SigningKeyType"].upper()) - signing_key_account = Wallet( - signing_key_seed, 0, algorithm=signing_key_algo + signing_key_account = Wallet.from_seed( + signing_key_seed, algorithm=signing_key_algo ).classic_address template_data = { @@ -122,8 +122,8 @@ def combine_bootstrap_pieces( ) signing_accounts.append(bootstrap_config["SigningKeyAccount"]) - locking_door = Wallet(locking_door_seed, 0) - issuing_door = Wallet(issuing_door_seed, 0) + locking_door = Wallet.from_seed(locking_door_seed) + issuing_door = Wallet.from_seed(issuing_door_seed) locking_issue = "XRP" issuing_issue = "XRP" diff --git a/xbridge_cli/server/config/prod/witness.py b/xbridge_cli/server/config/prod/witness.py index 5aa48e69..26e1021c 100644 --- a/xbridge_cli/server/config/prod/witness.py +++ b/xbridge_cli/server/config/prod/witness.py @@ -128,7 +128,7 @@ def generate_prod_witness_config( issuing_chain_ip, issuing_chain_port = issuing_chain.split(":") if signing_seed_param == "": - signing_seed = Wallet.create(crypto_algorithm=CryptoAlgorithm.SECP256K1).seed + signing_seed = Wallet.create(algorithm=CryptoAlgorithm.SECP256K1).seed else: signing_seed = signing_seed_param From 9f34ee8531a01b767f000953a6ec859ac11f8118 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 31 Oct 2023 14:04:26 -0400 Subject: [PATCH 12/12] have a default bootstrap piece location --- xbridge_cli/server/config/prod/bootstrap.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/xbridge_cli/server/config/prod/bootstrap.py b/xbridge_cli/server/config/prod/bootstrap.py index b234840e..a142360a 100644 --- a/xbridge_cli/server/config/prod/bootstrap.py +++ b/xbridge_cli/server/config/prod/bootstrap.py @@ -25,11 +25,15 @@ "-o", "--output_file", prompt=True, + default="./bootstrap-piece.json", type=click.Path(), - help="The location of the witness config file.", + help=( + "The location of the witness config file. The default is " + "'./bootstrap-piece.json'." + ), ) def get_bootstrap_piece_from_witness( - witness_file: str, output_file: Optional[str] = None + witness_file: str, output_file: Optional[str] = "./bootstrap-piece.json" ) -> None: """ Extract the info needed for the bootstrap file from a witness config file, without