"${HOME}/.aptly.conf"
-{
- "rootDir": "${HOME}/aptly",
- "downloadConcurrency": 4,
- "downloadSpeedLimit": 0,
- "architectures": [],
- "dependencyFollowSuggests": false,
- "dependencyFollowRecommends": false,
- "dependencyFollowAllVariants": false,
- "dependencyFollowSource": false,
- "dependencyVerboseResolve": false,
- "gpgDisableSign": false,
- "gpgDisableVerify": false,
- "gpgProvider": "gpg",
- "downloadSourcePackages": false,
- "skipLegacyPool": true,
- "ppaDistributorID": "ubuntu",
- "ppaCodename": "",
- "skipContentsPublishing": false,
- "FileSystemPublishEndpoints": {},
- "S3PublishEndpoints": {
- "algorand-releases": {
- "region":"us-east-1",
- "bucket":"algorand-releases",
- "acl":"public-read",
- "prefix":"deb"
- }
- },
- "SwiftPublishEndpoints": {}
-}
-EOF
-
-DEBS_DIR="$HOME/packages/deb/$CHANNEL"
-DEB="algorand_${CHANNEL}_linux-amd64_${VERSION}.deb"
-
-cp "$PKG_DIR/$DEB" "$DEBS_DIR"
-
-SNAPSHOT="${CHANNEL}-${VERSION}"
-aptly repo create -distribution="$CHANNEL" -component=main algorand
-aptly repo add algorand "$DEBS_DIR"/*.deb
-aptly snapshot create "$SNAPSHOT" from repo algorand
-aptly publish snapshot -gpg-key="$SIGNING_KEY_ADDR" -origin=Algorand -label=Algorand "$SNAPSHOT" "s3:algorand-releases:"
-
-echo
-date "+build_release end SNAPSHOT stage %Y%m%d_%H%M%S"
-echo
-
diff --git a/scripts/release/mule/deploy/deb/reverse_hex_timestamp b/scripts/release/mule/deploy/deb/reverse_hex_timestamp
new file mode 100755
index 0000000000..2c49f8d520
--- /dev/null
+++ b/scripts/release/mule/deploy/deb/reverse_hex_timestamp
@@ -0,0 +1,7 @@
+#!/usr/bin/env python3
+# a reverse hex timestamp is useful for putting newest things first in S3 bucket object sort order
+import sys
+import time
+
+sys.stdout.write('{:08x}'.format(0xfffffffff - int(time.time())))
+
diff --git a/scripts/release/mule/deploy/docker/docker.sh b/scripts/release/mule/deploy/docker/docker.sh
new file mode 100755
index 0000000000..6668b70df6
--- /dev/null
+++ b/scripts/release/mule/deploy/docker/docker.sh
@@ -0,0 +1,43 @@
+#!/usr/bin/env bash
+#
+# mainnet and testnet are pushed:
+# ./docker.sh mainnet 2.0.6
+#
+# For betanet:
+# ./docker.sh betanet
+#
+set -ex
+
+NETWORK=${NEWORK:-mainnet}
+VERSION=${VERSION:-latest}
+
+if [[ ! "$NETWORK" =~ ^mainnet$|^testnet$|^betanet$ ]]
+then
+ echo "[$0] Network values must be either \`mainnet\`, \`testnet\` or \`betanet\`."
+ exit 1
+fi
+
+pushd docker/releases
+
+if [ "$NETWORK" = mainnet ]
+then
+ # Build and push mainnet.
+ ./build_releases.sh
+
+ # Build and push testnet.
+ ./build_releases.sh --network testnet
+
+ if [ -z "$VERSION" ]
+ then
+ echo "[$0] No version specified."
+ exit 1
+ fi
+
+ ./build_releases.sh --tagname "$VERSION"
+elif [ "$NETWORK" = betanet ]
+then
+ ./build_releases.sh --network betanet
+fi
+
+popd
+
diff --git a/scripts/release/mule/deploy/releases_page/generate_releases_page.py b/scripts/release/mule/deploy/releases_page/generate_releases_page.py
new file mode 100755
index 0000000000..262a8a8fe5
--- /dev/null
+++ b/scripts/release/mule/deploy/releases_page/generate_releases_page.py
@@ -0,0 +1,195 @@
+#!/usr/bin/env python3
+#
+# This script builds https://releases.algorand.com/index.html.
+#
+# To run:
+# ./generate_releases_page.py > index.html
+
+import sys
+import boto3
+
+staging_bucket = "algorand-dev-deb-repo"
+staging_prefix = "http://algorand-dev-deb-repo.s3-website-us-east-1.amazonaws.com/"
+key_url = "https://releases.algorand.com/key.pub"
+releases_bucket = "algorand-releases"
+releases_prefix = "https://releases.algorand.com/"
+html_tpl = "html.tpl"
+styles_url = "releases_page.css"
+tokens = ["stable", "beta", "indexer"]
+
+def get_stage_release_set(response):
+ prefix = None
+ all = {}
+ they = []
+ for x in response["Contents"]:
+ path = x["Key"]
+ pre, fname = path.rsplit("/", 1)
+ if fname.startswith("tools_") or fname.startswith("install_") or fname.startswith("pending_"):
+ continue
+ if prefix is None:
+ prefix = pre
+ they.append(x)
+ elif prefix == pre:
+ they.append(x)
+ else:
+ all[prefix] = they
+ prefix = None
+ they = [x]
+ return all
+
+def release_set_files(rset):
+ files = {}
+ for x in rset:
+ path = x["Key"]
+ pre, fname = path.rsplit("/", 1)
+ if fname.startswith("hashes_"):
+ continue
+ didsuf = False
+ for suffix in (".asc", ".sig"):
+ if fname.endswith(suffix):
+ froot = fname[:-len(suffix)]
+ fd = files.get(froot)
+ if fd is None:
+ fd = {}
+ files[froot] = fd
+ fd[suffix] = x
+ didsuf = True
+ break
+ if didsuf:
+ continue
+ fd = files.get(fname)
+ if fd is None:
+ fd = {}
+ files[fname] = fd
+ fd["file"] = path
+ fd["Size"] = x["Size"]
+ return files
+
+def get_hashes_data(s3, rset):
+ text = ""
+ for x in rset:
+ path = x["Key"]
+ pre, fname = path.rsplit("/", 1)
+ if fname.endswith(".asc"):
+ continue
+ if fname.endswith(".sig"):
+ continue
+ if fname.startswith("hashes"):
+ ob = s3.get_object(Bucket=staging_bucket, Key=path)
+ text += ob["Body"].read().decode()
+ return text
+
+def read_hashes(fin):
+ by_fname = {}
+ for line in fin:
+ if not line:
+ continue
+ line = line.strip()
+ if not line:
+ continue
+ if line[0] == "#":
+ continue
+ hashstr, fname = line.split()
+ ob = by_fname.get(fname)
+ if not ob:
+ ob = {}
+ by_fname[fname] = ob
+ if len(hashstr) == 32:
+ ob["md5"] = hashstr
+ elif len(hashstr) == 64:
+ ob["sha256"] = hashstr
+ elif len(hashstr) == 128:
+ ob["sha512"] = hashstr
+ return by_fname
+
+def objects_by_fname(they):
+ out = {}
+ for x in they:
+ path = x["Key"]
+ if path.endswith("/"):
+ continue
+ parts = path.rsplit("/", 1)
+ fname = parts[-1]
+ out[fname] = x
+ return out
+
+def getContent(url):
+ with open(url, "r") as reader:
+ content = reader.read()
+
+ return content
+
+def build_page(channels):
+ html = getContent(html_tpl).replace("{styles}", getContent(styles_url))
+
+ for n in tokens:
+ html = html.replace("".join(["{", n, "}"]), "".join(channels[n]))
+
+ sys.stdout.write(html)
+
+def get_furl(release_files, fname, skey):
+ rfpath = release_files.get(fname)
+ if rfpath is not None:
+ return releases_prefix + rfpath["Key"]
+ else:
+ return staging_prefix + skey
+
+def main():
+ s3 = boto3.client("s3")
+ channels = {}
+
+ for channel in ["stable", "beta", "indexer"]:
+ staging_response = s3.list_objects_v2(Bucket=staging_bucket, Prefix="releases/" + channel + "/", MaxKeys=100)
+ release_sets = get_stage_release_set(staging_response)
+ releases_response = s3.list_objects_v2(Bucket=releases_bucket)
+ release_files = objects_by_fname(releases_response["Contents"])
+
+ table = []
+
+ for key, rset in release_sets.items():
+ hashftext = get_hashes_data(s3, rset)
+ fhashes = read_hashes(hashftext.splitlines())
+ files = release_set_files(rset)
+
+ for fname, info in files.items():
+ if "file" not in info:
+ continue
+ furl = get_furl(release_files, fname, info['file'])
+ ftext = ''.format(furl, fname)
+ sig = info.get(".sig")
+ stext = ""
+ if sig is not None:
+ sfname = sig["Key"].rsplit("/", 1)[-1]
+ surl = get_furl(release_files, sfname, sig["Key"])
+ stext = '.sig'.format(surl)
+ size = info.get("Size", "")
+ hashes = fhashes.get(fname)
+ if hashes:
+ for hn in ("md5", "sha256", "sha512"):
+ hv = hashes.get(hn)
+ if hv:
+ ftext += '{}
'.format(hn, hv)
+ if not hashes and not stext:
+ continue
+ tbody = ["{} | {} | {} |
".format(ftext, size, stext)]
+ table.append("".join(tbody))
+
+ # Only add the spacer *after* every set.
+ # It's not readily apparent to me why `indexer` would have a dict with a single
+ # item. This needs additional investigation.
+ #
+ # For instance, when creating the "indexer" table, the first line was empty b/c
+ # it added a spacer. This was b/c there were two dicts and the first only
+ # contained one item, which was useless.
+ #
+ # For now, just ignore those dicts.
+ if len(files.items()) > 1:
+ table.append(' |
')
+
+ channels[channel] = table
+
+ build_page(channels)
+
+if __name__ == "__main__":
+ main()
+
diff --git a/scripts/release/mule/deploy/releases_page/generate_releases_page.sh b/scripts/release/mule/deploy/releases_page/generate_releases_page.sh
new file mode 100755
index 0000000000..bccf5994c6
--- /dev/null
+++ b/scripts/release/mule/deploy/releases_page/generate_releases_page.sh
@@ -0,0 +1,17 @@
+#!/usr/bin/env bash
+
+# Note: For this script to correctly pick up the new release, the new repo containing the new
+# packages MUST have been already pushed to S3! (See the deb deployment mule step.)
+#
+# 1. Generate the new releases page from the contents of `algorand-dev-deb-repo/releases/CHANNEL`.
+# 2. Backup up the current releases page (index.html).
+# 3. Copy the new index.html to staging.
+# 4. Copy the new index.html to `algorand-releases`.
+
+set -ex
+
+./generate_releases_page.py > index.html
+aws s3 cp s3://algorand-releases/index.html s3://algorand-staging/releases-page/index.html-previous
+aws s3 cp index.html s3://algorand-staging/releases-page/
+aws s3 cp index.html s3://algorand-releases/
+
diff --git a/scripts/release/mule/deploy/releases_page/html.tpl b/scripts/release/mule/deploy/releases_page/html.tpl
new file mode 100644
index 0000000000..c52f342d45
--- /dev/null
+++ b/scripts/release/mule/deploy/releases_page/html.tpl
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+Algorand Releases
+See Algorand Developer Resources for instructions on installation and getting started
+The Algorand public key to verify these files (except RPM**) is at https://releases.algorand.com/key.pub
+The public key for verifying RPMs is https://releases.algorand.com/rpm/rpm_algorand.pub
+** The RPM package for the 2.0.3 release was signed with the https://releases.algorand.com/key.pub. All other releases will have been signed with the RPM key as noted.
+
+
+
+
+algod
+stable
+File | Bytes | GPG Signature |
+{stable}
+
+
+beta
+File | Bytes | GPG Signature |
+{beta}
+
+
+
+
+
+
+Indexer releases
+File | Bytes | GPG Signature |
+{indexer}
+
+
+
+
+
+
diff --git a/scripts/release/mule/deploy/releases_page/releases_page.css b/scripts/release/mule/deploy/releases_page/releases_page.css
new file mode 100644
index 0000000000..0475a70b1f
--- /dev/null
+++ b/scripts/release/mule/deploy/releases_page/releases_page.css
@@ -0,0 +1,47 @@
+div.hash {
+ font-family: monospace;
+}
+
+div.fname {
+ font-size: 120%;
+}
+
+section {
+ margin: 0 0 0 4em;
+}
+
+section h1 {
+ color: #000;
+ font-size: 175%;
+ margin-left: -3em;
+ padding: 20px;
+ width: 10em;
+}
+
+table {
+ border-collapse: collapse;
+}
+
+tr.spacer td {
+ border: 0;
+ padding: 20px 0;
+}
+
+th {
+ background-color: #DDD;
+ border: 2px inset gray;
+ padding: 10px;
+}
+
+td {
+ border: 2px inset gray;
+ padding: 1px;
+ text-align: center;
+ vertical-align: middle;
+ width: 200px;
+}
+
+td:first-child {
+ text-align: left;
+}
+
diff --git a/scripts/release/mule/deploy/rpm/deploy.sh b/scripts/release/mule/deploy/rpm/deploy.sh
index d8903f2df2..7c8ede1aa7 100755
--- a/scripts/release/mule/deploy/rpm/deploy.sh
+++ b/scripts/release/mule/deploy/rpm/deploy.sh
@@ -1,16 +1,35 @@
#!/usr/bin/env bash
-# shellcheck disable=2045
+# shellcheck disable=2035,2045
set -ex
+echo
+date "+build_release begin DEPLOY rpm stage %Y%m%d_%H%M%S"
+echo
+
+ARCH_TYPE=$(./scripts/archtype.sh)
+OS_TYPE=$(./scripts/ostype.sh)
+CHANNEL=${CHANNEL:-stable}
+NO_DEPLOY=${NO_DEPLOY:-false}
+PACKAGES_DIR=${PACKAGES_DIR:-"./tmp/node_pkgs/$OS_TYPE/$ARCH_TYPE"}
VERSION=${VERSION:-$(./scripts/compute_build_number.sh -f)}
-mule -f package-deploy.yaml package-deploy-setup-gnupg
+if [ -n "$S3_SOURCE" ]
+then
+ PREFIX="$S3_SOURCE/$CHANNEL/$VERSION"
+
+ aws s3 cp "s3://$PREFIX/algorand-$VERSION-1.x86_64.rpm" /root
+ aws s3 cp "s3://$PREFIX/algorand-devtools-$VERSION-1.x86_64.rpm" /root
+else
+ cp "$PACKAGES_DIR"/*"$VERSION"*.rpm /root
+fi
pushd /root
+
+aws s3 cp s3://algorand-devops-misc/tools/gnupg2.2.9_centos7_amd64.tar.bz2 .
tar jxf gnupg*.tar.bz2
-export PATH=/root/gnupg2/bin:"${PATH}"
+export PATH="/root/gnupg2/bin:$PATH"
export LD_LIBRARY_PATH=/root/gnupg2/lib
mkdir -p .gnupg
@@ -39,7 +58,7 @@ rpm.addSign(sys.argv[1], '')
EOF
mkdir rpmrepo
-for rpm in $(ls packages/rpm/stable/*"$VERSION"*.rpm)
+for rpm in $(ls *"$VERSION"*.rpm)
do
python2 rpmsign.py "$rpm"
cp -p "$rpm" rpmrepo
@@ -49,7 +68,16 @@ createrepo --database rpmrepo
rm -f rpmrepo/repodata/repomd.xml.asc
gpg -u rpm@algorand.com --detach-sign --armor rpmrepo/repodata/repomd.xml
-popd
+if $NO_DEPLOY
+then
+ popd
+ cp -r /root/rpmrepo .
+else
+ aws s3 sync rpmrepo "s3://algorand-releases/rpm/$CHANNEL/"
+ aws s3 cp *"$VERSION"*.rpm "s3://algorand-internal/packages/rpm/$CHANNEL/"
+fi
-mule -f package-deploy.yaml package-deploy-rpm-repo
+echo
+date "+build_release end DEPLOY rpm stage %Y%m%d_%H%M%S"
+echo
diff --git a/scripts/release/mule/gpg_preset_passphrase.sh b/scripts/release/mule/gpg_preset_passphrase.sh
new file mode 100755
index 0000000000..3a974c7022
--- /dev/null
+++ b/scripts/release/mule/gpg_preset_passphrase.sh
@@ -0,0 +1,13 @@
+#!/usr/bin/env bash
+
+gpgp=$(find /usr/lib/gnupg{2,,1} -type f -name gpg-preset-passphrase 2> /dev/null)
+
+# Here we need to grab the signing subkey, hence `tail -1`.
+KEYGRIP=$(gpg -K --with-keygrip --textmode dev@algorand.com | grep Keygrip | tail -1 | awk '{ print $3 }')
+echo "enter dev@ password"
+$gpgp --verbose --preset "$KEYGRIP"
+
+KEYGRIP=$(gpg -K --with-keygrip --textmode rpm@algorand.com | grep Keygrip | head -1 | awk '{ print $3 }')
+echo "enter rpm@ password"
+$gpgp --verbose --preset "$KEYGRIP"
+
diff --git a/scripts/release/mule/package/deb/package.sh b/scripts/release/mule/package/deb/package.sh
index 5662269b39..c8eb0e789a 100755
--- a/scripts/release/mule/package/deb/package.sh
+++ b/scripts/release/mule/package/deb/package.sh
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
-# shellcheck disable=2038,2045,2064
+# shellcheck disable=2038,2045,2064,2129,2162
set -ex
@@ -7,108 +7,114 @@ echo
date "+build_release begin PACKAGE DEB stage %Y%m%d_%H%M%S"
echo
-ARCH=$(./scripts/archtype.sh)
-OS_TYPE=$(./scripts/ostype.sh)
-BRANCH=${BRANCH:-$(./scripts/compute_branch.sh "$BRANCH")}
+BRANCH=${BRANCH:-$(./scripts/compute_branch.sh)}
CHANNEL=${CHANNEL:-$(./scripts/compute_branch_channel.sh "$BRANCH")}
-OUTDIR="./tmp/node_pkgs/$OS_TYPE/$ARCH"
-mkdir -p "$OUTDIR/bin"
-ALGO_BIN="./tmp/node_pkgs/$OS_TYPE/$ARCH/$CHANNEL/$OS_TYPE-$ARCH/bin"
-VER=${VERSION:-$(./scripts/compute_build_number.sh -f)}
+VERSION=${VERSION:-$(./scripts/compute_build_number.sh -f)}
# A make target in Makefile.mule may pass the name as an argument.
-ALGORAND_PACKAGE_NAME=${1:-$(./scripts/compute_package_name.sh "$CHANNEL")}
+PACKAGE_NAME="$1"
-echo "Building debian package for '${OS} - ${ARCH}'"
-
-DEFAULTNETWORK=$("./scripts/compute_branch_network.sh")
-DEFAULT_RELEASE_NETWORK=$("./scripts/compute_branch_release_network.sh" "${DEFAULTNETWORK}")
+DEFAULTNETWORK=${DEFAULTNETWORK:-$(./scripts/compute_branch_network.sh "$BRANCH")}
+DEFAULT_RELEASE_NETWORK=$("./scripts/compute_branch_release_network.sh" "$DEFAULTNETWORK")
export DEFAULT_RELEASE_NETWORK
-PKG_ROOT=$(mktemp -d)
-trap "rm -rf $PKG_ROOT" 0
-
-mkdir -p "${PKG_ROOT}/usr/bin"
-
-# NOTE: keep in sync with `./installer/rpm/algorand.spec`.
-if [[ "$ALGORAND_PACKAGE_NAME" =~ devtools ]]; then
- BIN_FILES=("carpenter" "catchupsrv" "msgpacktool" "tealcut" "tealdbg")
- UNATTENDED_UPGRADES_FILE="53algorand-devtools-upgrades"
- OUTPUT_DEB="$OUTDIR/algorand-devtools_${CHANNEL}_${OS_TYPE}-${ARCH}_${VER}.deb"
- REQUIRED_ALGORAND_PKG=$("./scripts/compute_package_name.sh" "$CHANNEL")
-else
- BIN_FILES=("algocfg" "algod" "algoh" "algokey" "ddconfig.sh" "diagcfg" "goal" "kmd" "node_exporter")
- UNATTENDED_UPGRADES_FILE="51algorand-upgrades"
- OUTPUT_DEB="$OUTDIR/algorand_${CHANNEL}_${OS_TYPE}-${ARCH}_${VER}.deb"
-fi
-
-for binary in "${BIN_FILES[@]}"; do
- cp "${ALGO_BIN}/${binary}" "${PKG_ROOT}"/usr/bin
- chmod 755 "${PKG_ROOT}/usr/bin/${binary}"
-done
-
-if [[ ! "$ALGORAND_PACKAGE_NAME" =~ devtools ]]; then
- mkdir -p "${PKG_ROOT}/usr/lib/algorand"
- lib_files=("updater" "find-nodes.sh")
- for lib in "${lib_files[@]}"; do
- cp "${ALGO_BIN}/${lib}" "${PKG_ROOT}/usr/lib/algorand"
- chmod g-w "${PKG_ROOT}/usr/lib/algorand/${lib}"
- done
-
- data_files=("config.json.example" "system.json")
- mkdir -p "${PKG_ROOT}/var/lib/algorand"
- for data in "${data_files[@]}"; do
- cp "installer/${data}" "${PKG_ROOT}/var/lib/algorand"
+find tmp/node_pkgs -name "*${CHANNEL}*linux*${VERSION}*.tar.gz" | cut -d '/' -f3-4 | sort --unique | while read OS_ARCH; do
+ PKG_ROOT=$(mktemp -d)
+ trap "rm -rf $PKG_ROOT" 0
+
+ ALGORAND_PACKAGE_NAME=$(./scripts/compute_package_name.sh "$CHANNEL" "$PACKAGE_NAME")
+ mkdir -p "${PKG_ROOT}/usr/bin"
+ OS_TYPE=$(echo "${OS_ARCH}" | cut -d '/' -f1)
+ ARCH=$(echo "${OS_ARCH}" | cut -d '/' -f2)
+ PKG_DIR="./tmp/node_pkgs/$OS_TYPE/$ARCH"
+ mkdir -p "$PKG_DIR/bin"
+ ALGO_BIN="${PKG_DIR}/$CHANNEL/$OS_TYPE-$ARCH/bin"
+
+ # NOTE: keep in sync with `./installer/rpm/algorand.spec`.
+ if [[ "$ALGORAND_PACKAGE_NAME" =~ devtools ]]; then
+ BIN_FILES=("carpenter" "catchupsrv" "msgpacktool" "tealcut" "tealdbg")
+ UNATTENDED_UPGRADES_FILE="53algorand-devtools-upgrades"
+ OUTPUT_DEB="$PKG_DIR/algorand-devtools_${CHANNEL}_${OS_TYPE}-${ARCH}_${VERSION}.deb"
+ REQUIRED_ALGORAND_PKG=$("./scripts/compute_package_name.sh" "$CHANNEL")
+ else
+ BIN_FILES=("algocfg" "algod" "algoh" "algokey" "ddconfig.sh" "diagcfg" "goal" "kmd" "node_exporter")
+ UNATTENDED_UPGRADES_FILE="51algorand-upgrades"
+ OUTPUT_DEB="$PKG_DIR/algorand_${CHANNEL}_${OS_TYPE}-${ARCH}_${VERSION}.deb"
+ fi
+
+ for binary in "${BIN_FILES[@]}"; do
+ cp "${ALGO_BIN}/$binary" "$PKG_ROOT/usr/bin"
+ chmod 755 "$PKG_ROOT/usr/bin/$binary"
done
- cp "./installer/genesis/${DEFAULTNETWORK}/genesis.json" "${PKG_ROOT}/var/lib/algorand/genesis.json"
-
- # files should not be group writable but directories should be
- chmod -R g-w "${PKG_ROOT}/var/lib/algorand"
- find "${PKG_ROOT}/var/lib/algorand" -type d | xargs chmod g+w
-
- SYSTEMD_FILES=("algorand.service" "algorand@.service")
- mkdir -p "${PKG_ROOT}/lib/systemd/system"
- for svc in "${SYSTEMD_FILES[@]}"; do
- cp "installer/${svc}" "${PKG_ROOT}/lib/systemd/system"
- chmod 644 "${PKG_ROOT}/lib/systemd/system/${svc}"
- done
-fi
-
-mkdir -p "${PKG_ROOT}/etc/apt/apt.conf.d"
-cat < "${PKG_ROOT}/etc/apt/apt.conf.d/${UNATTENDED_UPGRADES_FILE}"
+ if [[ ! "$ALGORAND_PACKAGE_NAME" =~ devtools ]]; then
+ mkdir -p "$PKG_ROOT/usr/lib/algorand"
+ lib_files=("updater" "find-nodes.sh")
+ for lib in "${lib_files[@]}"; do
+ cp "$ALGO_BIN/$lib" "$PKG_ROOT/usr/lib/algorand"
+ chmod g-w "$PKG_ROOT/usr/lib/algorand/$lib"
+ done
+
+ data_files=("config.json.example" "system.json")
+ mkdir -p "$PKG_ROOT/var/lib/algorand"
+ for data in "${data_files[@]}"; do
+ cp "installer/$data" "$PKG_ROOT/var/lib/algorand"
+ done
+
+ genesis_dirs=("devnet" "testnet" "mainnet" "betanet")
+ for dir in "${genesis_dirs[@]}"; do
+ mkdir -p "$PKG_ROOT/var/lib/algorand/genesis/$dir"
+ cp "./installer/genesis/$dir/genesis.json" "$PKG_ROOT/var/lib/algorand/genesis/$dir/genesis.json"
+ done
+ cp "./installer/genesis/$DEFAULT_RELEASE_NETWORK/genesis.json" "$PKG_ROOT/var/lib/algorand/genesis.json"
+
+ # files should not be group writable but directories should be
+ chmod -R g-w "$PKG_ROOT/var/lib/algorand"
+ find "$PKG_ROOT/var/lib/algorand" -type d | xargs chmod g+w
+
+ SYSTEMD_FILES=("algorand.service" "algorand@.service")
+ mkdir -p "$PKG_ROOT/lib/systemd/system"
+ for svc in "${SYSTEMD_FILES[@]}"; do
+ cp "installer/$svc" "$PKG_ROOT/lib/systemd/system"
+ chmod 644 "$PKG_ROOT/lib/systemd/system/$svc"
+ done
+ fi
+
+ mkdir -p "$PKG_ROOT/etc/apt/apt.conf.d"
+ cat > "$PKG_ROOT/etc/apt/apt.conf.d/$UNATTENDED_UPGRADES_FILE" << EOF
## This file is provided by the Algorand package to configure
## unattended upgrades for the Algorand node software.
Unattended-Upgrade::Allowed-Origins {
- "Algorand:${CHANNEL}";
+ "Algorand:$CHANNEL";
};
Dpkg::Options {
- "--force-confdef";
- "--force-confold";
+ "--force-confdef";
+ "--force-confold";
};
EOF
-mkdir -p "${PKG_ROOT}/DEBIAN"
-if [[ "$PKG_NAME" =~ devtools ]]; then
- INSTALLER_DIR="algorand-devtools"
-else
- INSTALLER_DIR=algorand
-fi
-# Can contain `control`, `preinst`, `postinst`, `prerm`, `postrm`, `conffiles`.
-CTL_FILES_DIR="installer/debian/${INSTALLER_DIR}"
-for ctl_file in $(ls "${CTL_FILES_DIR}"); do
- # Copy first, to preserve permissions, then overwrite to fill in template.
- cp -a "${CTL_FILES_DIR}/${ctl_file}" "${PKG_ROOT}/DEBIAN/${ctl_file}"
- < "${CTL_FILES_DIR}/${ctl_file}" \
- sed -e "s,@ARCH@,${ARCH}," \
- -e "s,@VER@,${VER}," \
- -e "s,@REQUIRED_ALGORAND_PKG@,$REQUIRED_ALGORAND_PKG," \
- > "${PKG_ROOT}/DEBIAN/${ctl_file}"
-done
+ mkdir -p "$PKG_ROOT/DEBIAN"
+ if [[ "$ALGORAND_PACKAGE_NAME" =~ devtools ]]; then
+ INSTALLER_DIR="algorand-devtools"
+ else
+ INSTALLER_DIR=algorand
+ fi
+ # Can contain `control`, `preinst`, `postinst`, `prerm`, `postrm`, `conffiles`.
+ CTL_FILES_DIR="installer/debian/$INSTALLER_DIR"
+ for ctl_file in $(ls "${CTL_FILES_DIR}"); do
+ # Copy first, to preserve permissions, then overwrite to fill in template.
+ cp -a "$CTL_FILES_DIR/$ctl_file" "$PKG_ROOT/DEBIAN/$ctl_file"
+ < "$CTL_FILES_DIR/$ctl_file" \
+ sed -e "s,@ARCH@,$ARCH," \
+ -e "s,@VER@,$VERSION," \
+ -e "s,@PKG_NAME@,$ALGORAND_PACKAGE_NAME," \
+ -e "s,@REQUIRED_ALGORAND_PKG@,$REQUIRED_ALGORAND_PKG," \
+ > "$PKG_ROOT/DEBIAN/$ctl_file"
+ done
-# TODO: make `Files:` segments for vendor/... and crypto/libsodium-fork, but reasonably this should be understood to cover all _our_ files and copied in packages continue to be licenced under their own terms
-cat < "${PKG_ROOT}/DEBIAN/copyright"
+ # TODO: make `Files:` segments for vendor/... and crypto/libsodium-fork, but reasonably this should be understood to cover all _our_ files and copied in packages continue to be licenced under their own terms
+ cat > "$PKG_ROOT/DEBIAN/copyright" << EOF
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: Algorand
Upstream-Contact: Algorand developers
@@ -119,13 +125,45 @@ Copyright: Algorand developers
License: AGPL-3+
EOF
-sed 's/^$/./g' < COPYING | sed 's/^/ /g' >> "${PKG_ROOT}/DEBIAN/copyright"
-mkdir -p "${PKG_ROOT}/usr/share/doc/${ALGORAND_PACKAGE_NAME}"
-cp -p "${PKG_ROOT}/DEBIAN/copyright" "${PKG_ROOT}/usr/share/doc/${ALGORAND_PACKAGE_NAME}/copyright"
+ sed 's/^$/./g' < COPYING | sed 's/^/ /g' >> "$PKG_ROOT/DEBIAN/copyright"
+ mkdir -p "$PKG_ROOT/usr/share/doc/$ALGORAND_PACKAGE_NAME"
+ cp -p "$PKG_ROOT/DEBIAN/copyright" "$PKG_ROOT/usr/share/doc/$ALGORAND_PACKAGE_NAME/copyright"
-dpkg-deb --build "${PKG_ROOT}" "${OUTPUT_DEB}"
+ dpkg-deb --build "$PKG_ROOT" "$OUTPUT_DEB"
-echo
-date "+build_release end PACKAGE DEB stage %Y%m%d_%H%M%S"
-echo
+ ############################################################
+
+ pushd "$PKG_DIR"
+
+ STATUSFILE=build_status_${CHANNEL}_${OS_TYPE}-${ARCH}_${VERSION}
+ cat >> "$STATUSFILE" << EOF
+go version:
+EOF
+
+ /usr/local/go/bin/go version >> "$STATUSFILE"
+
+ ############################################################
+
+ cat >> "$STATUSFILE" << EOF
+go env:
+EOF
+
+ /usr/local/go/bin/go env >> "$STATUSFILE"
+
+ ############################################################
+
+ cat >> "$STATUSFILE" << EOF
+dpkg-l:
+EOF
+
+ dpkg -l >> "$STATUSFILE"
+
+ popd
+
+ ############################################################
+
+ echo
+ date "+build_release end PACKAGE DEB stage %Y%m%d_%H%M%S"
+ echo
+done
diff --git a/scripts/release/mule/package/docker/package.sh b/scripts/release/mule/package/docker/package.sh
index 92efb4310a..d04faac906 100755
--- a/scripts/release/mule/package/docker/package.sh
+++ b/scripts/release/mule/package/docker/package.sh
@@ -6,13 +6,13 @@ echo
date "+build_release begin PACKAGE DOCKER stage %Y%m%d_%H%M%S"
echo
-ARCH=$(./scripts/archtype.sh)
+ARCH_TYPE=$(./scripts/archtype.sh)
OS_TYPE=$(./scripts/ostype.sh)
BRANCH=${BRANCH:-$(./scripts/compute_branch.sh "$BRANCH")}
CHANNEL=${CHANNEL:-$(./scripts/compute_branch_channel.sh "$BRANCH")}
-PKG_ROOT_DIR="./tmp/node_pkgs/$OS_TYPE/$ARCH"
-FULLVERSION=${VERSION:-$(./scripts/compute_build_number.sh -f)}
-ALGOD_INSTALL_TAR_FILE="$PKG_ROOT_DIR/node_${CHANNEL}_${OS_TYPE}-${ARCH}_${FULLVERSION}.tar.gz"
+PKG_ROOT_DIR="./tmp/node_pkgs/$OS_TYPE/$ARCH_TYPE"
+VERSION=${VERSION:-$(./scripts/compute_build_number.sh -f)}
+ALGOD_INSTALL_TAR_FILE="$PKG_ROOT_DIR/node_${CHANNEL}_${OS_TYPE}-${ARCH_TYPE}_${VERSION}.tar.gz"
if [ -f "$ALGOD_INSTALL_TAR_FILE" ]; then
echo "using install file $ALGOD_INSTALL_TAR_FILE"
@@ -22,7 +22,7 @@ else
fi
INPUT_ALGOD_TAR_FILE="temp_install.tar.gz"
-CHANNEL_VERSION="${CHANNEL}_${FULLVERSION}"
+CHANNEL_VERSION="${CHANNEL}_${VERSION}"
NEW_PKG_DIR="algod_pkg_$CHANNEL_VERSION"
DOCKER_EXPORT_FILE="algod_docker_export_$CHANNEL_VERSION.tar.gz"
DOCKER_PKG_FILE="algod_docker_package_$CHANNEL_VERSION.tar.gz"
diff --git a/scripts/release/mule/package/rpm/package.sh b/scripts/release/mule/package/rpm/package.sh
index 3d60cb9d29..98cc95394b 100755
--- a/scripts/release/mule/package/rpm/package.sh
+++ b/scripts/release/mule/package/rpm/package.sh
@@ -1,51 +1,56 @@
#!/bin/bash
+# shellcheck disable=2086,2162
set -ex
echo "Building RPM package"
REPO_DIR=$(pwd)
-ARCH=$(./scripts/archtype.sh)
-OS_TYPE=$(./scripts/ostype.sh)
FULLVERSION=${VERSION:-$(./scripts/compute_build_number.sh -f)}
-BRANCH=${BRANCH:-$(git rev-parse --abbrev-ref HEAD)}
+BRANCH=${BRANCH:-$(./scripts/compute_branch.sh)}
CHANNEL=${CHANNEL:-$(./scripts/compute_branch_channel.sh "$BRANCH")}
-ALGO_BIN="$REPO_DIR/tmp/node_pkgs/$OS_TYPE/$ARCH/$CHANNEL/$OS_TYPE-$ARCH/bin"
-# TODO: Should there be a default network?
-DEFAULTNETWORK=devnet
+DEFAULTNETWORK=${DEFAULTNETWORK:-$(./scripts/compute_branch_network.sh "$BRANCH")}
DEFAULT_RELEASE_NETWORK=$(./scripts/compute_branch_release_network.sh "$DEFAULTNETWORK")
-
-# A make target in Makefile.mule may pass the name as an argument.
-ALGORAND_PACKAGE_NAME=${1:-$(./scripts/compute_package_name.sh "$CHANNEL")}
-
-if [[ "$ALGORAND_PACKAGE_NAME" =~ devtools ]]; then
- REQUIRED_ALGORAND_PACKAGE=$(./scripts/compute_package_name.sh "$CHANNEL")
-fi
-
-# The following need to be exported for use in ./go-algorand/installer/rpm/$ALGORAND_PACKAGE_NAME/$ALGORAND_PACKAGE_NAME.spec.
-export DEFAULT_NETWORK
-export DEFAULT_RELEASE_NETWORK
-export REPO_DIR
-export ALGO_BIN
-
-RPMTMP=$(mktemp -d 2>/dev/null || mktemp -d -t "rpmtmp")
-trap 'rm -rf $RPMTMP' 0
-
-TEMPDIR=$(mktemp -d)
-if [[ "$ALGORAND_PACKAGE_NAME" =~ devtools ]]; then
- INSTALLER_DIR="algorand-devtools"
-else
- INSTALLER_DIR=algorand
-fi
-trap 'rm -rf $TEMPDIR' 0
-< "./installer/rpm/$INSTALLER_DIR/$INSTALLER_DIR.spec" \
- sed -e "s,@ALGORAND_PACKAGE_NAME@,$REQUIRED_ALGORAND_PACKAGE," \
- -e "s,@VER@,$FULLVERSION," \
- -e "s,@ARCH@,$ARCH," \
- -e "s,@REQUIRED_ALGORAND_PKG@,$ALGORAND_PACKAGE_NAME," \
- > "$TEMPDIR/$ALGORAND_PACKAGE_NAME.spec"
-
-rpmbuild --buildroot "$HOME/foo" --define "_rpmdir $RPMTMP" --define "RELEASE_GENESIS_PROCESS x$RELEASE_GENESIS_PROCESS" --define "LICENSE_FILE ./COPYING" -bb "$TEMPDIR/$ALGORAND_PACKAGE_NAME.spec"
-
-cp -p "$RPMTMP"/*/*.rpm "./tmp/node_pkgs/$OS_TYPE/$ARCH"
-
+PACKAGE_NAME="$1"
+
+find tmp/node_pkgs -name "*${CHANNEL}*linux*${FULLVERSION}*.tar.gz" | cut -d '/' -f3-4 | sort --unique | while read OS_ARCH; do
+ OS_TYPE=$(echo "${OS_ARCH}" | cut -d '/' -f1)
+ ARCH_TYPE=$(echo "${OS_ARCH}" | cut -d '/' -f2)
+ ARCH_UNAME=$(./scripts/release/common/cpu_name.sh ${ARCH_TYPE})
+ ALGO_BIN="$REPO_DIR/tmp/node_pkgs/$OS_TYPE/$ARCH_TYPE/$CHANNEL/$OS_TYPE-$ARCH_TYPE/bin"
+ # A make target in Makefile.mule may pass the name as an argument.
+ ALGORAND_PACKAGE_NAME=$(./scripts/compute_package_name.sh "$CHANNEL" "$PACKAGE_NAME")
+
+ if [[ "$ALGORAND_PACKAGE_NAME" =~ devtools ]]; then
+ REQUIRED_ALGORAND_PACKAGE=$(./scripts/compute_package_name.sh "$CHANNEL")
+ fi
+
+ # The following need to be exported for use in ./go-algorand/installer/rpm/$ALGORAND_PACKAGE_NAME/$ALGORAND_PACKAGE_NAME.spec.
+ export DEFAULTNETWORK
+ export DEFAULT_RELEASE_NETWORK
+ export REPO_DIR
+ export ALGO_BIN
+
+ RPMTMP=$(mktemp -d 2>/dev/null || mktemp -d -t "rpmtmp")
+ trap 'rm -rf $RPMTMP' 0
+
+ TEMPDIR=$(mktemp -d)
+ if [[ "$ALGORAND_PACKAGE_NAME" =~ devtools ]]; then
+ INSTALLER_DIR="algorand-devtools"
+ else
+ INSTALLER_DIR=algorand
+ fi
+ trap 'rm -rf $TEMPDIR' 0
+ < "./installer/rpm/$INSTALLER_DIR/$INSTALLER_DIR.spec" \
+ sed -e "s,@PKG_NAME@,$ALGORAND_PACKAGE_NAME," \
+ -e "s,@VER@,$FULLVERSION," \
+ -e "s,@ARCH@,$ARCH_UNAME," \
+ -e "s,@REQUIRED_ALGORAND_PKG@,$REQUIRED_ALGORAND_PACKAGE," \
+ > "$TEMPDIR/$ALGORAND_PACKAGE_NAME.spec"
+
+ rpmbuild --buildroot "$HOME/foo" --define "_rpmdir $RPMTMP" --define "RELEASE_GENESIS_PROCESS xtrue" --define "LICENSE_FILE ./COPYING" -bb "$TEMPDIR/$ALGORAND_PACKAGE_NAME.spec" --target $ARCH_UNAME
+
+ cp -p "$RPMTMP"/*/*.rpm "./tmp/node_pkgs/$OS_TYPE/$ARCH_TYPE"
+ echo "${RPMTMP}"
+ echo "${TEMPDIR}"
+done
diff --git a/scripts/release/mule/sign/sign.sh b/scripts/release/mule/sign/sign.sh
index 272f132da1..7fec7f677d 100755
--- a/scripts/release/mule/sign/sign.sh
+++ b/scripts/release/mule/sign/sign.sh
@@ -1,5 +1,7 @@
#!/usr/bin/env bash
-# shellcheck disable=2035
+# shellcheck disable=2035,2129,2162
+
+# TODO: This needs to be reworked a bit to support Darwin.
set -exo pipefail
@@ -7,84 +9,72 @@ echo
date "+build_release begin SIGN stage %Y%m%d_%H%M%S"
echo
-PKG_TYPE="$1"
-ARCH_BIT=$(uname -m)
-ARCH_TYPE=$(./scripts/archtype.sh)
-OS_TYPE=$(./scripts/ostype.sh)
VERSION=${VERSION:-$(./scripts/compute_build_number.sh -f)}
-BRANCH=${BRANCH:-$(git rev-parse --abbrev-ref HEAD)}
+BRANCH=${BRANCH:-$(./scripts/compute_branch.sh)}
CHANNEL=${CHANNEL:-$(./scripts/compute_branch_channel.sh "$BRANCH")}
-PKG_DIR="./tmp/node_pkgs/$OS_TYPE/$ARCH_TYPE"
+PKG_DIR="./tmp/node_pkgs"
SIGNING_KEY_ADDR=dev@algorand.com
-if ! $USE_CACHE
-then
- export ARCH_BIT
- export ARCH_TYPE
- export CHANNEL
- export OS_TYPE
- export VERSION
-
- if [ "$PKG_TYPE" == "tar.gz" ]
- then
- mule -f package-sign.yaml package-sign-setup-tarball
- else
- mule -f package-sign.yaml "package-sign-setup-$PKG_TYPE"
- fi
-fi
-
-make_hashes () {
- # We need to futz a bit with "source" to make the hashes correct.
- local HASH_TYPE=${1:-$PKG_TYPE}
- local PACKAGE_TYPE=${2:-$PKG_TYPE}
-
- HASHFILE="hashes_${CHANNEL}_${OS_TYPE}_${ARCH_TYPE}_${VERSION}_${HASH_TYPE}"
- # Remove any previously-generated hashes.
- rm -f "$HASHFILE"*
-
- {
- md5sum *"$VERSION"*."$PACKAGE_TYPE" ;
- shasum -a 256 *"$VERSION"*."$PACKAGE_TYPE" ;
- shasum -a 512 *"$VERSION"*."$PACKAGE_TYPE" ;
- } >> "$HASHFILE"
+# It seems that copying/mounting the gpg dir from another machine can result in insecure
+# access privileges, so set the correct permissions to avoid the following warning:
+#
+# gpg: WARNING: unsafe permissions on homedir '/root/.gnupg'
+#
+find /root/.gnupg -type d -exec chmod 700 {} \;
+find /root/.gnupg -type f -exec chmod 600 {} \;
- gpg -u "$SIGNING_KEY_ADDR" --detach-sign "$HASHFILE"
- gpg -u "$SIGNING_KEY_ADDR" --clearsign "$HASHFILE"
-}
+mkdir -p "$PKG_DIR"
+cd "$PKG_DIR"
-make_sigs () {
- local PACKAGE_TYPE=${1:-$PKG_TYPE}
-
- # Remove any previously-generated signatures.
- rm -f ./*"$VERSION"*."$PACKAGE_TYPE".sig
-
- for item in *"$VERSION"*."$1"
- do
- gpg -u "$SIGNING_KEY_ADDR" --detach-sign "$item"
- done
-}
-
-pushd "$PKG_DIR"
+if [ -n "$S3_SOURCE" ]
+then
+ aws s3 cp --recursive --exclude "*" --include "*$CHANNEL*$VERSION*" "s3://$S3_SOURCE/$CHANNEL/$VERSION" .
+fi
-GPG_HOME_DIR=$(gpgconf --list-dirs | grep homedir | awk -F: '{ print $2 }')
-chmod 400 "$GPG_HOME_DIR"
+# TODO: "$PKG_TYPE" == "source"
-if [ "$PKG_TYPE" == "source" ]
-then
- git archive --prefix="algorand-$FULLVERSION/" "$BRANCH" | gzip >| "$PKG_DIR/algorand_${CHANNEL}_source_${VERSION}.tar.gz"
- make_sigs tar.gz
- make_hashes source tar.gz
-else
- if [ "$PKG_TYPE" == "rpm" ]
+# https://unix.stackexchange.com/a/46259
+# Grab the directories directly underneath (max-depth 1) ./tmp/node_pkgs/ into a space-delimited string.
+# This will help us target `linux`, `darwin` and (possibly) `windows` build assets.
+# Note the surrounding parens turns the string created by `find` into an array.
+OS_TYPES=($(find . -mindepth 1 -maxdepth 1 -type d -printf '%f\n'))
+for os in "${OS_TYPES[@]}"; do
+ if [ "$os" = linux ]
then
- SIGNING_KEY_ADDR=rpm@algorand.com
+ ARCHS=(amd64 arm arm64)
+ for arch in "${ARCHS[@]}"; do
+ (
+ mkdir -p "$os/$arch"
+ cd "$os/$arch"
+
+ # Clean package directory of any previous operations.
+ rm -rf hashes* *.sig *.asc *.asc.gz
+
+ for file in *.tar.gz *.deb
+ do
+ gpg -u "$SIGNING_KEY_ADDR" --detach-sign "$file"
+ done
+
+ for file in *.rpm
+ do
+ gpg -u rpm@algorand.com --detach-sign "$file"
+ done
+
+ HASHFILE="hashes_${CHANNEL}_${os}_${arch}_${VERSION}"
+ md5sum *.tar.gz *.deb *.rpm >> "$HASHFILE"
+ shasum -a 256 *.tar.gz *.deb *.rpm >> "$HASHFILE"
+ shasum -a 512 *.tar.gz *.deb *.rpm >> "$HASHFILE"
+
+ gpg -u "$SIGNING_KEY_ADDR" --detach-sign "$HASHFILE"
+ gpg -u "$SIGNING_KEY_ADDR" --clearsign "$HASHFILE"
+
+ STATUSFILE="build_status_${CHANNEL}_${os}-${arch}_${VERSION}"
+ gpg -u "$SIGNING_KEY_ADDR" --clearsign "$STATUSFILE"
+ gzip -c "$STATUSFILE.asc" > "$STATUSFILE.asc.gz"
+ )
+ done
fi
-
- make_sigs "$PKG_TYPE"
- make_hashes
-fi
-
-popd
+done
echo
date "+build_release end SIGN stage %Y%m%d_%H%M%S"
diff --git a/scripts/release/mule/test/test.sh b/scripts/release/mule/test/test.sh
index 831220ecc3..33b80c76d5 100755
--- a/scripts/release/mule/test/test.sh
+++ b/scripts/release/mule/test/test.sh
@@ -1,4 +1,5 @@
#!/usr/bin/env bash
+# shellcheck disable=2045
set -ex
@@ -10,35 +11,87 @@ export ARCH_TYPE
OS_TYPE=$(./scripts/ostype.sh)
export OS_TYPE
-if [ -z "$VERSION" ]; then
- VERSION=${VERSION:-$(./scripts/compute_build_number.sh -f)}
-fi
-export VERSION
-
-if [ -z "$BRANCH" ]; then
- BRANCH=${BRANCH:-$(git rev-parse --abbrev-ref HEAD)}
-fi
-export BRANCH
+export BRANCH=${BRANCH:-$(./scripts/compute_branch.sh)}
+export CHANNEL=${CHANNEL:-$(./scripts/compute_branch_channel.sh "$BRANCH")}
+export NETWORK=${NETWORK:-$(./scripts/compute_branch_network.sh "$BRANCH")}
+export SHA=${SHA:-$(git rev-parse HEAD)}
+export VERSION=${VERSION:-$(./scripts/compute_build_number.sh -f)}
+ALGORAND_PACKAGE_NAME=$([ "$CHANNEL" = beta ] && echo algorand-beta || echo algorand)
+DEVTOOLS_PACKAGE_NAME=$([ "$CHANNEL" = beta ] && echo algorand-devtools-beta || echo algorand-devtools)
+export ALGORAND_PACKAGE_NAME
+export DEVTOOLS_PACKAGE_NAME
-if [ -z "$CHANNEL" ]; then
- CHANNEL=${CHANNEL:-$(./scripts/compute_branch_channel.sh "$BRANCH")}
-fi
-export CHANNEL
+PKG_DIR="./tmp/node_pkgs/$OS_TYPE/$ARCH_TYPE"
-if [ -z "$SHA" ]; then
- SHA=${SHA:-$(git rev-parse HEAD)}
-fi
-export SHA
+mkdir -p "$PKG_DIR"
+pushd "$PKG_DIR"
-if ! $USE_CACHE
+if [ -n "$S3_SOURCE" ]
then
- mule -f package-test.yaml "package-test-setup-$PKG_TYPE"
+ PREFIX="$S3_SOURCE/$CHANNEL/$VERSION"
+
+ # deb
+ aws s3 cp "s3://$PREFIX/algorand_${CHANNEL}_${OS_TYPE}-${ARCH_TYPE}_${VERSION}.deb" .
+ aws s3 cp "s3://$PREFIX/algorand-devtools_${CHANNEL}_${OS_TYPE}-${ARCH_TYPE}_${VERSION}.deb" .
+
+ # rpm
+ aws s3 cp "s3://$PREFIX/algorand-$VERSION-1.$ARCH_BIT.rpm" .
+ aws s3 cp "s3://$PREFIX/algorand-devtools-$VERSION-1.$ARCH_BIT.rpm" .
fi
-if [[ "$ARCH_TYPE" =~ "arm" ]]
+popd
+
+for test in $(ls ./scripts/release/mule/test/tests/pre/*.sh)
+do
+ echo ">>>>>>>>>> PRE TESTING $(basename "$test")"
+ bash "$test"
+done
+
+pushd "$PKG_DIR"
+
+if [ "$PKG_TYPE" = deb ]
then
- ./scripts/release/mule/test/tests/run_tests -b "$BRANCH" -c "$CHANNEL" -h "$SHA" -r "$VERSION"
+ dpkg -i algorand_*"$VERSION"*.deb
+ dpkg -i algorand-devtools*"$VERSION"*.deb
else
- ./scripts/release/mule/test/util/test_package.sh
+ # We need to install this since it's not being installed by a package manager.
+ # Normally, this is installed for us b/c it's a dependency.
+ # See `./installer/rpm/algorand/algorand.spec`.
+ yum install yum-cron -y
+ #
+ # Note that the RPM package DOES NOT have the CHANNEL in its filename (unlike DEB),
+ # instead it contains the package name.
+ #
+ # deb:
+ # algorand_CHANNEL*VERSION.deb
+ # algorand-devtools_CHANNEL*VERSION.deb
+ #
+ # (this pattern is for all channels)
+ #
+ # rpm:
+ # (this pattern is for stable)
+ # algorand-VERSION*.rpm
+ # algorand-devtools-VERSION.rpm
+ #
+ # (this pattern is for beta)
+ # algorand-beta-VERSION*.rpm
+ # algorand-devtools-beta-VERSION.rpm
+ #
+ # SO.....
+ # ALGORAND_PACKAGE_NAME-VERSION*.rpm
+ # DEVTOOLS_PACKAGE_NAME-beta-VERSION.rpm
+ #
+ # Hope that makes sense :)
+ #
+ rpm -i "$ALGORAND_PACKAGE_NAME"-"$VERSION"-1."$ARCH_BIT".rpm
+ rpm -i "$DEVTOOLS_PACKAGE_NAME"-*"$VERSION"-1."$ARCH_BIT".rpm
fi
+popd
+
+for test in $(ls ./scripts/release/mule/test/tests/post/*.sh)
+do
+ echo ">>>>>>>>>> POST TESTING $(basename "$test")"
+ bash "$test"
+done
+
diff --git a/scripts/release/mule/test/tests/goal.sh b/scripts/release/mule/test/tests/goal.sh
deleted file mode 100755
index b7812b4a93..0000000000
--- a/scripts/release/mule/test/tests/goal.sh
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/usr/bin/env bash
-
-set -ex
-
-# Check that the installed version is now the current version.
-algod -v | grep -q "${VERSION}.${CHANNEL}"
-
-mkdir -p /root/testnode
-cp -p /var/lib/algorand/genesis.json /root/testnode
-
-goal node start -d /root/testnode
-goal node wait -d /root/testnode -w 120
-goal node stop -d /root/testnode
-
diff --git a/scripts/release/mule/test/tests/post/verify_genesis_file.sh b/scripts/release/mule/test/tests/post/verify_genesis_file.sh
new file mode 100755
index 0000000000..5dd515b67a
--- /dev/null
+++ b/scripts/release/mule/test/tests/post/verify_genesis_file.sh
@@ -0,0 +1,30 @@
+#!/usr/bin/env bash
+
+set -ex
+
+echo "[$0] Testing network string in genesis.json"
+
+# We're looking for a line that looks like the following:
+#
+# "network": "mainnet",
+#
+
+GEN_FILE=/var/lib/algorand/genesis.json
+cd "./tmp/node_pkgs/$OS_TYPE/$ARCH_TYPE"
+
+if [ ! -f "$GEN_FILE" ]
+then
+ echo "[$0] The genesis file is not present."
+ exit 1
+fi
+
+EXPECTED_NETWORK=$(jq -r '.network' $GEN_FILE)
+
+if [ "$NETWORK" != "$EXPECTED_NETWORK" ]
+then
+ echo "[$0] The network value \`$NETWORK\` in \`$GEN_FILE\` is incorrect, it does not match \`$EXPECTED_NETWORK\`."
+ exit 1
+fi
+
+echo "[$0] The network value \`$NETWORK\` in \`$GEN_FILE\` is correct."
+
diff --git a/scripts/release/mule/test/tests/post/verify_package_binaries.sh b/scripts/release/mule/test/tests/post/verify_package_binaries.sh
new file mode 100755
index 0000000000..1a61dba1e7
--- /dev/null
+++ b/scripts/release/mule/test/tests/post/verify_package_binaries.sh
@@ -0,0 +1,79 @@
+#!/usr/bin/env bash
+# shellcheck disable=2116
+
+set -ex
+
+echo "[$0] Verifying installed binaries..."
+
+RET=0
+RPMTMP=$(mktemp -d)
+
+cd "./tmp/node_pkgs/$OS_TYPE/$ARCH_TYPE"
+
+if [ "$PKG_TYPE" = deb ]
+then
+ dpkg -L "$ALGORAND_PACKAGE_NAME" > "$RPMTMP/algorand.install"
+ dpkg -L "$DEVTOOLS_PACKAGE_NAME" > "$RPMTMP/algorand-devtools.install"
+else
+ rpm -ql "$ALGORAND_PACKAGE_NAME" > "$RPMTMP/algorand.install"
+ rpm -ql "$DEVTOOLS_PACKAGE_NAME" > "$RPMTMP/algorand-devtools.install"
+fi
+
+ALGORAND_BINS=(
+ /usr/bin/algocfg
+ /usr/bin/algod
+ /usr/bin/algoh
+ /usr/bin/algokey
+ /usr/bin/ddconfig.sh
+ /usr/bin/diagcfg
+ /usr/bin/goal
+ /usr/bin/kmd
+ /usr/bin/node_exporter
+)
+
+for bin in "${ALGORAND_BINS[@]}"; do
+ if ! grep "$bin" "$RPMTMP/algorand.install" > /dev/null
+ then
+ MISSING_ALGORAND_BINS+=("$bin")
+ fi
+done
+
+DEVTOOLS_BINS=(
+ /usr/bin/carpenter
+ /usr/bin/catchupsrv
+ /usr/bin/msgpacktool
+ /usr/bin/tealcut
+ /usr/bin/tealdbg
+)
+
+for bin in "${DEVTOOLS_BINS[@]}"; do
+ if ! grep "$bin" "$RPMTMP/algorand-devtools.install" > /dev/null
+ then
+ MISSING_DEVTOOLS_BINS+=("$bin")
+ fi
+done
+
+LEN=$(echo ${#MISSING_ALGORAND_BINS[*]})
+if [ "$LEN" -gt 0 ]
+then
+ echo "The following binaries are not contained in the \`algorand\` package:"
+ for (( i=0; i= 2.1.6)
+ #
+
+ cp "./tmp/node_pkgs/$OS_TYPE/$ARCH_TYPE"/algorand-devtools*"$CHANNEL"*"$VERSION"*.deb "$RPMTMP"
+ cd "$RPMTMP"
+ ar xv *"$VERSION"*.deb
+ tar xf control.tar.xz
+
+ if ! grep -F "Pre-Depends: $ALGORAND_PACKAGE_NAME (>= $VERSION)" control
+ then
+ echo "[$0] The dependency for $ALGORAND_PACKAGE_NAME version $VERSION is incorrect."
+ exit 1
+ fi
+
+ echo "[$0] The dependency for $ALGORAND_PACKAGE_NAME version $VERSION is correct."
+else
+ # Note that the .spec file isn't packaged in the RPM. There are tools such `rpmrebuild` that
+ # attempt to generate the .spec file, but it doesn't give us the info we need.
+ #
+ # Instead, we'll just install using `dpkg` and grep the error stream.
+ #
+ # Also, note that the RPM package DOES NOT have the CHANNEL in its filename (unlike DEB)!!
+ if ! rpm -i "./tmp/node_pkgs/$OS_TYPE/$ARCH_TYPE/algorand-devtools-"*"$VERSION"*"$ARCH_BIT".rpm 2> "$RPMTMP/rpm.install"
+ then
+ #
+ # We're looking for lines that looks like the following:
+ #
+ # error: Failed dependencies:
+ # algorand >= 2.1.86017 is needed by algorand-devtools-2.1.86017-1.x86_64
+ #
+ if [[ $(cat "$RPMTMP/rpm.install") =~ "$ALGORAND_PACKAGE_NAME >= $VERSION is needed by $DEVTOOLS_PACKAGE_NAME-$VERSION" ]]
+ then
+ echo "[$0] The package \`algorand-devtools\` correctly has a dependency on package $ALGORAND_PACKAGE_NAME and failed to install."
+ exit 0
+ fi
+
+ echo "[$0] The package \`algorand-devtools\` failed to install because of a missing dependency other than the $ALGORAND_PACKAGE_NAME package."
+ exit 1
+ else
+ echo "[$0] The package \`algorand-devtools\` was installed without any dependencies, while it should have a dependency on the $ALGORAND_PACKAGE_NAME package."
+ exit 1
+ fi
+fi
+
diff --git a/scripts/release/mule/test/tests/run_tests b/scripts/release/mule/test/tests/run_tests
deleted file mode 100755
index c7ba6e23a9..0000000000
--- a/scripts/release/mule/test/tests/run_tests
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/usr/bin/env bash
-# shellcheck disable=2045
-
-set -ex
-
-# This is currently used by `test_package.sh`.
-# It is copied into a docker image at build time and then invoked at run time.
-
-BRANCH=
-CHANNEL=
-COMMIT_HASH=
-FULLVERSION=
-
-while [ "$1" != "" ]; do
- case "$1" in
- -b)
- shift
- BRANCH="$1"
- ;;
- -c)
- shift
- CHANNEL="$1"
- ;;
- -h)
- shift
- COMMIT_HASH="$1"
- ;;
- -r)
- shift
- FULLVERSION="$1"
- ;;
- *)
- echo "Unknown option" "$1"
- exit 1
- ;;
- esac
- shift
-done
-
-if [ -z "$BRANCH" ] || [ -z "$CHANNEL" ] || [ -z "$COMMIT_HASH" ] || [ -z "$FULLVERSION" ]
-then
- echo "[ERROR] $0 -b $BRANCH -c $CHANNEL -h $COMMIT_HASH -r $FULLVERSION"
- exit 1
-fi
-
-if [ "$PKG_TYPE" == "deb" ]
-then
- for deb in $(ls "$WORKDIR/tmp/node_pkgs/$OS_TYPE/$ARCH_TYPE"/*"$FULLVERSION"*.deb); do
- if [[ ! "$deb" =~ devtools ]]; then
- dpkg -i "$deb"
- fi
- done
-else
- for rpm in $(ls "$WORKDIR/tmp/node_pkgs/$OS_TYPE/$ARCH_TYPE"/*"$FULLVERSION"*.rpm); do
- if [[ ! "$rpm" =~ devtools ]]; then
- yum install "$rpm" -y
- fi
- done
-fi
-
-export BRANCH
-export COMMIT_HASH
-export CHANNEL
-export FULLVERSION
-
-for test in $(ls ./scripts/release/mule/test/tests/*.sh)
-do
- bash "$test"
-done
-
diff --git a/scripts/release/mule/test/util/test_package.sh b/scripts/release/mule/test/util/test_package.sh
deleted file mode 100755
index e18c882c44..0000000000
--- a/scripts/release/mule/test/util/test_package.sh
+++ /dev/null
@@ -1,91 +0,0 @@
-#!/usr/bin/env bash
-
-set -ex
-
-trap cleanup 0
-
-OS_LIST=
-
-if [ "$PKG_TYPE" == "deb" ]
-then
- OS_LIST=(
- ubuntu:16.04
- ubuntu:18.04
- )
-else
- # TODO: The following error happens on centos:8
- #
- # Error:
- # Problem: conflicting requests
- # - nothing provides yum-cron needed by algorand-2.0.4-1.x86_64
- # (try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)
- # algod: command not found
- OS_LIST=(
- centos:7
- # centos:8
- fedora:28
- )
-fi
-
-FAILED=()
-
-build_images () {
- # We'll use this simple tokenized Dockerfile.
- # https://serverfault.com/a/72511
- TOKENIZED=$(echo -e "\
-FROM {{OS}}\n\n\
-WORKDIR /root\n\
-COPY . .\n\
-CMD [\"/bin/bash\"]")
-
- for item in ${OS_LIST[*]}
- do
- # Use pattern substitution here (like sed).
- # ${parameter/pattern/substitution}
- echo -e "${TOKENIZED/\{\{OS\}\}/$item}" > Dockerfile
- if ! docker build -t "${item}-run-tests" .
- then
- FAILED+=("$item")
- fi
- done
-}
-
-run_images () {
- for item in ${OS_LIST[*]}
- do
- echo "[$0] Running ${item}-test..."
-
- if ! docker run --rm --name algorand -e OS_TYPE="$OS_TYPE" -e ARCH_TYPE="$ARCH_TYPE" -e PKG_TYPE="$PKG_TYPE" -e WORKDIR="$WORKDIR" --volumes-from "$HOSTNAME" -t "${item}-run-tests" bash ./scripts/release/mule/test/tests/run_tests -b "$BRANCH" -c "$CHANNEL" -h "$SHA" -r "$VERSION"
- then
- FAILED+=("$item")
- fi
- done
-}
-
-cleanup() {
- rm -f Dockerfile
-}
-
-check_failures() {
- if [ "${#FAILED[@]}" -gt 0 ]
- then
- echo -e "\n[$0] The following images could not be $1:"
-
- for failed in ${FAILED[*]}
- do
- echo " - $failed"
- done
-
- echo
- exit 1
- fi
-}
-
-build_images
-check_failures built
-echo "[$0] All builds completed with no failures."
-
-run_images
-check_failures verified
-echo "[$0] All runs completed with no failures."
-
diff --git a/scripts/travis/before_build.sh b/scripts/travis/before_build.sh
index 49ad1a0108..b6f733518e 100755
--- a/scripts/travis/before_build.sh
+++ b/scripts/travis/before_build.sh
@@ -55,6 +55,11 @@ if [ "${OS}-${ARCH}" = "linux-arm" ]; then
exit 0
fi
+if [ "${OS}-${ARCH}" = "windows-amd64" ]; then
+ echo "Skipping running 'go vet'/gofmt/golint for windows builds"
+ exit 0
+fi
+
echo "Running go vet..."
go vet $(GO111MODULE=off go list ./... | grep -v /test/e2e-go/)
diff --git a/scripts/travis/build.sh b/scripts/travis/build.sh
index 25bcb88705..243899be7e 100755
--- a/scripts/travis/build.sh
+++ b/scripts/travis/build.sh
@@ -69,8 +69,9 @@ scripts/travis/before_build.sh
# Force re-evaluation of genesis files to see if source files changed w/o running make
touch gen/generate.go
-if [ "${OS}-${ARCH}" = "linux-arm" ]; then
+if [ "${OS}-${ARCH}" = "linux-arm" ] || [ "${OS}-${ARCH}" = "windows-amd64" ]; then
# for arm, build just the basic distro
+ # for windows, we still have some issues with the enlistment checking, so we'll make it simple for now.
MAKE_DEBUG_OPTION=""
fi
diff --git a/scripts/travis/configure_dev.sh b/scripts/travis/configure_dev.sh
index f5d4e7c057..ed8e8b203e 100755
--- a/scripts/travis/configure_dev.sh
+++ b/scripts/travis/configure_dev.sh
@@ -24,6 +24,11 @@ elif [[ "${OS}" == "darwin" ]]; then
brew update
brew tap homebrew/cask
brew pin boost || true
+elif [[ "${OS}" == "windows" ]]; then
+ git config --global core.autocrlf true
+ # Golang probably is not installed under MSYS2 so add the environment variable temporarily
+ export GOPATH=$HOME/go
+ mkdir -p $GOPATH/bin
fi
"${SCRIPTPATH}/../configure_dev.sh"
diff --git a/scripts/travis/test.sh b/scripts/travis/test.sh
index 179ae9e265..ebbe815194 100755
--- a/scripts/travis/test.sh
+++ b/scripts/travis/test.sh
@@ -18,10 +18,11 @@ curl -sL -o ~/gimme https://raw.githubusercontent.com/travis-ci/gimme/master/gim
chmod +x ~/gimme
eval $(~/gimme "${GOLANG_VERSION}")
-if [ "${OS}-${ARCH}" = "linux-arm" ]; then
- # for arm, no tests need to be invoked.
- exit 0
-fi
+if [ "${OS}-${ARCH}" = "linux-arm" ] || [ "${OS}-${ARCH}" = "windows-amd64" ]; then
+ # for arm, no tests need to be invoked.
+ # for now, disable tests on windows.
+ exit 0
+ fi
GOPATHBIN=$(go env GOPATH)/bin
export PATH=$PATH:$GOPATHBIN
diff --git a/scripts/windows/instructions.md b/scripts/windows/instructions.md
new file mode 100644
index 0000000000..b24370bcf7
--- /dev/null
+++ b/scripts/windows/instructions.md
@@ -0,0 +1,25 @@
+1. Download and install `MSYS2` package from [here](https://www.msys2.org/)
+
+2. Run `MSYS2 MingW 64-bit` application to open the MSYS2 terminal.
+
+3. Update MSYS2 package and dependency manager by running the following commands:
+
+ ```
+ pacman -Syu --disable-download-timeout
+ ```
+
+ NOTE: It is very likely MSYS2 will ask to close the window and repeat the command for furter updates. Check `MSYS2` web page for additional support.
+
+4. Install GIT on MSYS2 by executing the following command:
+
+ ```
+ pacman -S --disable-download-timeout --noconfirm git
+ ```
+
+5. Clone repository with `git clone https://github.com/algorand/go-algorand`.
+
+6. Switch to source code directory with `cd go-algorand`.
+
+7. Run `./scripts/configure_dev.sh` to install required dependencies.
+
+8. Run `make`.
diff --git a/shared/pingpong/accounts.go b/shared/pingpong/accounts.go
index efedb51254..ce1083e62b 100644
--- a/shared/pingpong/accounts.go
+++ b/shared/pingpong/accounts.go
@@ -89,9 +89,10 @@ func ensureAccounts(ac libgoal.Client, initCfg PpConfig) (accounts map[string]ui
fmt.Printf("Located Source Account: %s -> %v\n", cfg.SrcAccount, accounts[cfg.SrcAccount])
}
- // Only reuse existing accounts for non asset testing.
+ // Only reuse existing accounts for non asset testing and non app testing.
// For asset testing, new participant accounts will be created since accounts are limited to 1000 assets.
- if cfg.NumAsset == 0 {
+ // For app testing, new participant accounts will be created since accounts are limited to 10 aps.
+ if cfg.NumAsset == 0 && cfg.NumApp == 0 {
// If we have more accounts than requested, pick the top N (not including src)
if len(accounts) > int(cfg.NumPartAccounts+1) {
fmt.Printf("Finding the richest %d accounts to use for transacting\n", cfg.NumPartAccounts)
@@ -158,7 +159,9 @@ func prepareAssets(accounts map[string]uint64, client libgoal.Client, cfg PpConf
return
}
assetName := fmt.Sprintf("pong%d", i)
- fmt.Printf("Creating asset %s\n", assetName)
+ if !cfg.Quiet {
+ fmt.Printf("Creating asset %s\n", assetName)
+ }
tx, createErr := client.MakeUnsignedAssetCreateTx(totalSupply, false, addr, addr, addr, addr, "ping", assetName, "", meta, 0)
if createErr != nil {
fmt.Printf("Cannot make asset create txn with meta %v\n", meta)
@@ -196,7 +199,9 @@ func prepareAssets(accounts map[string]uint64, client libgoal.Client, cfg PpConf
// 2) For each participant account, opt-in to assets of all other participant accounts
for addr := range accounts {
- fmt.Printf("Opting in assets from account %v\n", addr)
+ if !cfg.Quiet {
+ fmt.Printf("Opting in assets from account %v\n", addr)
+ }
addrAccount, addrErr := client.AccountInformation(addr)
if addrErr != nil {
fmt.Printf("Cannot lookup source account\n")
@@ -205,15 +210,21 @@ func prepareAssets(accounts map[string]uint64, client libgoal.Client, cfg PpConf
}
assetParams := addrAccount.AssetParams
- fmt.Printf("Optining in %d assets %+v\n", len(assetParams), assetParams)
+ if !cfg.Quiet {
+ fmt.Printf("Optining in %d assets %+v\n", len(assetParams), assetParams)
+ }
// Opt-in Accounts for each asset
for k := range assetParams {
- fmt.Printf("optin asset %+v\n", k)
+ if !cfg.Quiet {
+ fmt.Printf("optin asset %+v\n", k)
+ }
for addr2 := range accounts {
if addr != addr2 {
- fmt.Printf("Opting in assets to account %v \n", addr2)
+ if !cfg.Quiet {
+ fmt.Printf("Opting in assets to account %v \n", addr2)
+ }
_, addrErr2 := client.AccountInformation(addr2)
if addrErr2 != nil {
fmt.Printf("Cannot lookup optin account\n")
@@ -251,7 +262,9 @@ func prepareAssets(accounts map[string]uint64, client libgoal.Client, cfg PpConf
// Step 3) Evenly distribute the assets across all participant accounts
for addr := range accounts {
- fmt.Printf("Distributing assets from account %v\n", addr)
+ if !cfg.Quiet {
+ fmt.Printf("Distributing assets from account %v\n", addr)
+ }
addrAccount, addrErr := client.AccountInformation(addr)
if addrErr != nil {
fmt.Printf("Cannot lookup source account\n")
@@ -260,18 +273,22 @@ func prepareAssets(accounts map[string]uint64, client libgoal.Client, cfg PpConf
}
assetParams := addrAccount.AssetParams
- fmt.Printf("Distributing %d assets\n", len(assetParams))
+ if !cfg.Quiet {
+ fmt.Printf("Distributing %d assets\n", len(assetParams))
+ }
// Distribute assets to each account
for k := range assetParams {
-
- fmt.Printf("Distributing asset %v \n", k)
+ if !cfg.Quiet {
+ fmt.Printf("Distributing asset %v \n", k)
+ }
assetAmt := assetParams[k].Total / uint64(len(accounts))
for addr2 := range accounts {
if addr != addr2 {
-
- fmt.Printf("Distributing assets from %v to %v \n", addr, addr2)
+ if !cfg.Quiet {
+ fmt.Printf("Distributing assets from %v to %v \n", addr, addr2)
+ }
tx, sendErr := constructTxn(addr, addr2, cfg.MaxFee, assetAmt, k, client, cfg)
if sendErr != nil {
@@ -318,31 +335,15 @@ func signAndBroadcastTransaction(accounts map[string]uint64, sender string, tx t
return
}
-func genBigNoOp(numOps uint32) []byte {
- var progParts []string
- progParts = append(progParts, `#pragma version 2`)
- for i := uint32(0); i < numOps/2; i++ {
- progParts = append(progParts, `int 1`)
- progParts = append(progParts, `pop`)
- }
- progParts = append(progParts, `int 1`)
- progParts = append(progParts, `return`)
- progAsm := strings.Join(progParts, "\n")
- progBytes, err := logic.AssembleString(progAsm)
- if err != nil {
- panic(err)
- }
- return progBytes
-}
-
-func genBigHashes(numHashes int, numPad int, hash string) []byte {
+func genBigNoOpAndBigHashes(numOps uint32, numHashes uint32, hashSize string) []byte {
var progParts []string
progParts = append(progParts, `#pragma version 2`)
progParts = append(progParts, `byte base64 AA==`)
- for i := 0; i < numHashes; i++ {
- progParts = append(progParts, hash)
+
+ for i := uint32(0); i < numHashes; i++ {
+ progParts = append(progParts, hashSize)
}
- for i := 0; i < numPad/2; i++ {
+ for i := uint32(0); i < numOps/2; i++ {
progParts = append(progParts, `int 1`)
progParts = append(progParts, `pop`)
}
@@ -425,12 +426,21 @@ func genMaxClone(numKeys int) []byte {
}
func prepareApps(accounts map[string]uint64, client libgoal.Client, cfg PpConfig) (appParams map[uint64]v1.AppParams, err error) {
- // get existing apps
- account, accountErr := client.AccountInformation(cfg.SrcAccount)
- if accountErr != nil {
- fmt.Printf("Cannot lookup source account")
- err = accountErr
- return
+
+ var appAccount v1.Account
+ for tempAccount := range accounts {
+ if tempAccount != cfg.SrcAccount {
+ appAccount, err = client.AccountInformation(tempAccount)
+ if err != nil {
+ fmt.Printf("Warning, cannot lookup tempAccount account %s", tempAccount)
+ return
+ }
+ break
+ }
+ }
+
+ if !cfg.Quiet {
+ fmt.Printf("Selected temp account: %s\n", appAccount.Address)
}
// Get wallet handle token
@@ -440,27 +450,30 @@ func prepareApps(accounts map[string]uint64, client libgoal.Client, cfg PpConfig
return
}
- toCreate := int(cfg.NumApp) - len(account.AppParams)
+ toCreate := int(cfg.NumApp)
// create apps in srcAccount
for i := 0; i < toCreate; i++ {
var tx transactions.Transaction
// generate app program with roughly some number of operations
- prog := genBigNoOp(cfg.AppProgOps)
+ prog := genBigNoOpAndBigHashes(cfg.AppProgOps, cfg.AppProgHashs, cfg.AppProgHashSize)
+ if !cfg.Quiet {
+ fmt.Printf("generated program: \n%s\n", prog)
+ }
globSchema := basics.StateSchema{NumByteSlice: 64}
locSchema := basics.StateSchema{}
tx, err = client.MakeUnsignedAppCreateTx(transactions.NoOpOC, prog, prog, globSchema, locSchema, nil, nil, nil, nil)
if err != nil {
fmt.Printf("Cannot create app txn\n")
- return
+ panic(err)
}
- tx, err = client.FillUnsignedTxTemplate(cfg.SrcAccount, 0, 0, cfg.MaxFee, tx)
+ tx, err = client.FillUnsignedTxTemplate(appAccount.Address, 0, 0, cfg.MaxFee, tx)
if err != nil {
fmt.Printf("Cannot fill app creation txn\n")
- return
+ panic(err)
}
// Ensure different txids
@@ -486,15 +499,15 @@ func prepareApps(accounts map[string]uint64, client libgoal.Client, cfg PpConfig
fmt.Printf("Create a new app: txid=%s\n", txid)
}
- accounts[cfg.SrcAccount] -= tx.Fee.Raw
+ accounts[appAccount.Address] -= tx.Fee.Raw
}
+ var account v1.Account
// get these apps
for {
- account, accountErr = client.AccountInformation(cfg.SrcAccount)
- if accountErr != nil {
- fmt.Printf("Cannot lookup source account")
- err = accountErr
+ account, err = client.AccountInformation(appAccount.Address)
+ if err != nil {
+ fmt.Printf("Warning, cannot lookup source account")
return
}
if len(account.AppParams) >= int(cfg.NumApp) {
diff --git a/shared/pingpong/config.go b/shared/pingpong/config.go
index 7941f7d278..40b61a0776 100644
--- a/shared/pingpong/config.go
+++ b/shared/pingpong/config.go
@@ -54,7 +54,10 @@ type PpConfig struct {
MinAccountAsset uint64
NumApp uint32
AppProgOps uint32
+ AppProgHashs uint32
+ AppProgHashSize string
Rekey bool
+ MaxRuntime time.Duration
}
// DefaultConfig object for Ping Pong
@@ -78,7 +81,10 @@ var DefaultConfig = PpConfig{
MinAccountAsset: 10000000,
NumApp: 0,
AppProgOps: 0,
+ AppProgHashs: 0,
+ AppProgHashSize: "sha256",
Rekey: false,
+ MaxRuntime: 0,
}
// LoadConfigFromFile reads and loads Ping Pong configuration
diff --git a/shared/pingpong/pingpong.go b/shared/pingpong/pingpong.go
index b266e6a5f0..266d87a4e6 100644
--- a/shared/pingpong/pingpong.go
+++ b/shared/pingpong/pingpong.go
@@ -25,7 +25,7 @@ import (
"time"
"github.com/algorand/go-algorand/crypto"
- v1 "github.com/algorand/go-algorand/daemon/algod/api/spec/v1"
+ "github.com/algorand/go-algorand/daemon/algod/api/spec/v1"
"github.com/algorand/go-algorand/data/basics"
"github.com/algorand/go-algorand/data/transactions"
"github.com/algorand/go-algorand/libgoal"
@@ -40,61 +40,77 @@ func PrepareAccounts(ac libgoal.Client, initCfg PpConfig) (accounts map[string]u
return
}
+ wallet, walletErr := ac.GetUnencryptedWalletHandle()
+ if err != nil {
+ _, _ = fmt.Fprintf(os.Stderr, "unable to access wallet %v\n", walletErr)
+ err = walletErr
+ return
+ }
if cfg.NumAsset > 0 {
// zero out max amount for asset transactions
cfg.MaxAmt = 0
- wallet, walletErr := ac.GetUnencryptedWalletHandle()
+ var assetAccounts map[string]uint64
+ assetAccounts, err = prepareNewAccounts(ac, cfg, wallet, accounts)
if err != nil {
- _, _ = fmt.Fprintf(os.Stderr, "unable to access wallet %v\n", walletErr)
- err = walletErr
+ _, _ = fmt.Fprintf(os.Stderr, "prepare new accounts failed: %v\n", err)
return
}
- fmt.Printf("Generating %v new accounts for asset transfer test\n", cfg.NumPartAccounts)
- // remove existing accounts except for src account
- for k := range accounts {
- if k != cfg.SrcAccount {
- delete(accounts, k)
- }
- }
- // create new accounts for asset testing
- assetAccounts := make(map[string]uint64)
- assetAccounts, err = generateAccounts(ac, assetAccounts, cfg.NumPartAccounts-1, wallet)
- for addr := range assetAccounts {
- fmt.Printf("generated account %v\n", addr)
+ assetParams, err = prepareAssets(assetAccounts, ac, cfg)
+ if err != nil {
+ _, _ = fmt.Fprintf(os.Stderr, "prepare assets failed %v\n", err)
+ return
}
- for k := range assetAccounts {
- accounts[k] = assetAccounts[k]
+ if !cfg.Quiet {
+ for addr := range accounts {
+ fmt.Printf("final prepareAccounts, account addr: %s, balance: %d\n", addr, accounts[addr])
+ }
}
- err = fundAccounts(accounts, ac, cfg)
+ } else if cfg.NumApp > 0 {
+
+ var appAccounts map[string]uint64
+ appAccounts, err = prepareNewAccounts(ac, cfg, wallet, accounts)
if err != nil {
- _, _ = fmt.Fprintf(os.Stderr, "fund accounts failed %v\n", err)
+ _, _ = fmt.Fprintf(os.Stderr, "prepare new accounts failed: %v\n", err)
return
}
-
- assetParams, err = prepareAssets(assetAccounts, ac, cfg)
+ appParams, err = prepareApps(appAccounts, ac, cfg)
if err != nil {
- _, _ = fmt.Fprintf(os.Stderr, "prepare assets failed %v\n", err)
return
}
-
- for k := range assetAccounts {
- accounts[k] = assetAccounts[k]
+ if !cfg.Quiet {
+ for addr := range accounts {
+ fmt.Printf("final prepareAccounts, account addr: %s, balance: %d\n", addr, accounts[addr])
+ }
}
- } else if cfg.NumApp > 0 {
- appParams, err = prepareApps(accounts, ac, cfg)
+ } else {
+ err = fundAccounts(accounts, ac, cfg)
if err != nil {
+ _, _ = fmt.Fprintf(os.Stderr, "fund accounts failed %v\n", err)
return
}
}
- for addr := range accounts {
- fmt.Printf("**** participant account %v\n", addr)
+ return
+}
+
+func prepareNewAccounts(client libgoal.Client, cfg PpConfig, wallet []byte, accounts map[string]uint64) (newAccounts map[string]uint64, err error) {
+ // remove existing accounts except for src account
+ for k := range accounts {
+ if k != cfg.SrcAccount {
+ delete(accounts, k)
+ }
}
+ // create new accounts for testing
+ newAccounts = make(map[string]uint64)
+ newAccounts, err = generateAccounts(client, newAccounts, cfg.NumPartAccounts-1, wallet)
- err = fundAccounts(accounts, ac, cfg)
+ for k := range newAccounts {
+ accounts[k] = newAccounts[k]
+ }
+ err = fundAccounts(accounts, client, cfg)
if err != nil {
_, _ = fmt.Fprintf(os.Stderr, "fund accounts failed %v\n", err)
return
@@ -107,6 +123,11 @@ func PrepareAccounts(ac libgoal.Client, initCfg PpConfig) (accounts map[string]u
func computeAccountMinBalance(cfg PpConfig) (requiredBalance uint64) {
const minActiveAccountBalance uint64 = 100000 // min balance for any active account
+ if cfg.NumApp > 0 {
+ requiredBalance = (cfg.MinAccountFunds + (cfg.MaxAmt+cfg.MaxFee)*10) * 2
+ fmt.Printf("required min balance for app accounts: %d\n", requiredBalance)
+ return
+ }
var fee uint64 = 1000
if cfg.MinFee > fee {
fee = cfg.MinFee
@@ -148,18 +169,26 @@ func fundAccounts(accounts map[string]uint64, client libgoal.Client, cfg PpConfi
fmt.Printf("adjusting account balance to %d\n", minFund)
for addr, balance := range accounts {
- fmt.Printf("adjusting balance of account %v\n", addr)
+ if !cfg.Quiet {
+ fmt.Printf("adjusting balance of account %v\n", addr)
+ }
if balance < minFund {
toSend := minFund - balance
if srcFunds <= toSend {
return fmt.Errorf("source account %s has insufficient funds %d - needs %d", cfg.SrcAccount, srcFunds, toSend)
}
srcFunds -= toSend
- _, err := client.SendPaymentFromUnencryptedWallet(cfg.SrcAccount, addr, fee, toSend, nil)
+ if !cfg.Quiet {
+ fmt.Printf("adjusting balance of account %v by %d\n ", addr, toSend)
+ }
+ _, err := sendPaymentFromUnencryptedWallet(client, cfg.SrcAccount, addr, fee, toSend, nil)
if err != nil {
return err
}
accounts[addr] = minFund
+ if !cfg.Quiet {
+ fmt.Printf("account balance for key %s is %d\n", addr, accounts[addr])
+ }
totalSent++
throttleTransactionRate(startTime, cfg, totalSent)
@@ -168,6 +197,18 @@ func fundAccounts(accounts map[string]uint64, client libgoal.Client, cfg PpConfi
return nil
}
+func sendPaymentFromUnencryptedWallet(client libgoal.Client, from, to string, fee, amount uint64, note []byte) (transactions.Transaction, error) {
+ wh, err := client.GetUnencryptedWalletHandle()
+ if err != nil {
+ return transactions.Transaction{}, err
+ }
+ // generate a random lease to avoid duplicate transaction failures
+ var lease [32]byte
+ crypto.RandBytes(lease[:])
+
+ return client.SendPaymentFromWalletWithLease(wh, nil, from, to, fee, amount, note, "", lease, 0, 0)
+}
+
func refreshAccounts(accounts map[string]uint64, client libgoal.Client, cfg PpConfig) error {
for addr := range accounts {
amount, err := client.GetBalance(addr)
@@ -221,6 +262,10 @@ func RunPingPong(ctx context.Context, ac libgoal.Client, accounts map[string]uin
} else {
runTime = 10000 * time.Hour // Effectively 'forever'
}
+ var endTime time.Time
+ if cfg.MaxRuntime > 0 {
+ endTime = time.Now().Add(cfg.MaxRuntime)
+ }
restTime := cfg.RestTime
refreshTime := time.Now().Add(cfg.RefreshTime)
@@ -234,6 +279,11 @@ func RunPingPong(ctx context.Context, ac libgoal.Client, accounts map[string]uin
var totalSent, totalSucceeded uint64
for !time.Now().After(stopTime) {
+ if cfg.MaxRuntime > 0 && time.Now().After(endTime) {
+ fmt.Printf("Terminating after max run time of %.f seconds\n", cfg.MaxRuntime.Seconds())
+ return
+ }
+
minimumAmount := cfg.MinAccountFunds + (cfg.MaxAmt+cfg.MaxFee)*2
fromList := listSufficientAccounts(accounts, minimumAmount, cfg.SrcAccount)
// in group tests txns are sent back and forth, so both parties need funds
@@ -358,6 +408,9 @@ func sendFromTo(
sentCount++
_, sendErr = client.BroadcastTransaction(stxn)
+ if sendErr != nil {
+ fmt.Printf("Warning, cannot broadcast txn, %s\n", sendErr)
+ }
} else {
// Generate txn group
diff --git a/test/e2e-go/cli/algod/expect/algodTelemetryLocationTest.exp b/test/e2e-go/cli/algod/expect/algodTelemetryLocationTest.exp
index d25628338a..72d84bfec2 100644
--- a/test/e2e-go/cli/algod/expect/algodTelemetryLocationTest.exp
+++ b/test/e2e-go/cli/algod/expect/algodTelemetryLocationTest.exp
@@ -2,8 +2,6 @@
set err 0
log_user 1
-
-
if { [catch {
source algodExpectCommon.exp
@@ -18,14 +16,11 @@ if { [catch {
#allows script to be run outside of go context
exec mkdir -p $TEST_PRIMARY_NODE_DIR
-
- exec goal node stop -d $TEST_PRIMARY_NODE_DIR
exec rm -f $TEST_PRIMARY_NODE_DIR/logging.config
::Algod::ReadTelemetry $TEST_PRIMARY_NODE_DIR
-
exec rm -d -r -f $TEST_ALGO_DIR
puts "Basic Algod Test Successful"
exit 0
diff --git a/test/e2e-go/cli/goal/expect/catchpointCatchupTest.exp b/test/e2e-go/cli/goal/expect/catchpointCatchupTest.exp
index f09ec8d0a9..476546da90 100755
--- a/test/e2e-go/cli/goal/expect/catchpointCatchupTest.exp
+++ b/test/e2e-go/cli/goal/expect/catchpointCatchupTest.exp
@@ -71,8 +71,6 @@ if { [catch {
set ::GLOBAL_TEST_ROOT_DIR $TEST_ROOT_DIR
set ::GLOBAL_NETWORK_NAME $NETWORK_NAME
- set ::env(ALGOSMALLLAMBDAMSEC) 500
-
# Start the Primary Node
::AlgorandGoal::StartNode $TEST_ROOT_DIR/Primary
diff --git a/test/e2e-go/cli/goal/expect/goalAccountInfoTest.exp b/test/e2e-go/cli/goal/expect/goalAccountInfoTest.exp
new file mode 100644
index 0000000000..3bba5b8776
--- /dev/null
+++ b/test/e2e-go/cli/goal/expect/goalAccountInfoTest.exp
@@ -0,0 +1,159 @@
+#!/usr/bin/expect -f
+set err 0
+log_user 1
+
+if { [catch {
+ source goalExpectCommon.exp
+ set TEST_ALGO_DIR [lindex $argv 0]
+ set TEST_DATA_DIR [lindex $argv 1]
+
+ puts "TEST_ALGO_DIR: $TEST_ALGO_DIR"
+ puts "TEST_DATA_DIR: $TEST_DATA_DIR"
+
+ set timeout 60
+ set TIME_STAMP [clock seconds]
+
+ set TEST_ROOT_DIR $TEST_ALGO_DIR/root
+ set TEST_PRIMARY_NODE_DIR $TEST_ROOT_DIR/Primary/
+ set NETWORK_NAME test_net_expect_$TIME_STAMP
+ set NETWORK_TEMPLATE "$TEST_DATA_DIR/nettemplates/TwoNodes50Each.json"
+ set TEAL_PROGS_DIR "$TEST_DATA_DIR/../scripts/e2e_subs/tealprogs"
+
+ # Create network
+ ::AlgorandGoal::CreateNetwork $NETWORK_NAME $NETWORK_TEMPLATE $TEST_ALGO_DIR $TEST_ROOT_DIR
+
+ # Start network
+ ::AlgorandGoal::StartNetwork $NETWORK_NAME $NETWORK_TEMPLATE $TEST_ALGO_DIR $TEST_ROOT_DIR
+
+ set PRIMARY_NODE_ADDRESS [ ::AlgorandGoal::GetAlgodNetworkAddress $TEST_PRIMARY_NODE_DIR ]
+ puts "Primary Node Address: $PRIMARY_NODE_ADDRESS"
+
+ set PRIMARY_WALLET_NAME unencrypted-default-wallet
+
+ # Determine primary account
+ set PRIMARY_ACCOUNT_ADDRESS [::AlgorandGoal::GetHighestFundedAccountForWallet $PRIMARY_WALLET_NAME $TEST_PRIMARY_NODE_DIR]
+
+ set EMPTY_EXPECTED "Created Assets:
+\t
+Held Assets:
+\t
+Created Apps:
+\t
+Opted In Apps:
+\t"
+
+ # Check info with no assets
+ puts "goal account info -w $PRIMARY_WALLET_NAME -a $PRIMARY_ACCOUNT_ADDRESS -d $TEST_PRIMARY_NODE_DIR"
+ set EMPTY_ACTUAL [exec goal account info -w $PRIMARY_WALLET_NAME -a $PRIMARY_ACCOUNT_ADDRESS -d $TEST_PRIMARY_NODE_DIR]
+ puts $EMPTY_ACTUAL
+
+ if { $EMPTY_ACTUAL ne $EMPTY_EXPECTED } {
+ ::AlgorandGoal::Abort "Invalid response for account info. Expected:\n$EMPTY_EXPECTED"
+ }
+
+ # Create A-Coin
+ set ACOIN_UNIT_NAME "AC"
+ ::AlgorandGoal::AssetCreate $PRIMARY_ACCOUNT_ADDRESS $PRIMARY_WALLET_NAME "" 1000 0 "A-Coin" $ACOIN_UNIT_NAME $TEST_PRIMARY_NODE_DIR
+
+ # Create B-Coin
+ set BCOIN_UNIT_NAME "BC"
+ ::AlgorandGoal::AssetCreate $PRIMARY_ACCOUNT_ADDRESS $PRIMARY_WALLET_NAME "" 1000 0 "" $BCOIN_UNIT_NAME $TEST_PRIMARY_NODE_DIR
+
+ # Create C-Coin
+ set CCOIN_UNIT_NAME ""
+ ::AlgorandGoal::AssetCreate $PRIMARY_ACCOUNT_ADDRESS $PRIMARY_WALLET_NAME "" 1000 0 "C-Coin" $CCOIN_UNIT_NAME $TEST_PRIMARY_NODE_DIR
+
+ # Create D-Coin
+ set DCOIN_UNIT_NAME "DC"
+ ::AlgorandGoal::AssetCreate $PRIMARY_ACCOUNT_ADDRESS $PRIMARY_WALLET_NAME "" 1000 2 "D-Coin" $DCOIN_UNIT_NAME $TEST_PRIMARY_NODE_DIR
+
+ # wait about 2 rounds
+ set ASSET_WAIT 10
+ puts "Wait $ASSET_WAIT for asset creation"
+ exec sleep $ASSET_WAIT
+
+ set ACOIN_ASSET_ID [::AlgorandGoal::AssetLookup $PRIMARY_ACCOUNT_ADDRESS $ACOIN_UNIT_NAME $TEST_PRIMARY_NODE_DIR]
+ set BCOIN_ASSET_ID [::AlgorandGoal::AssetLookup $PRIMARY_ACCOUNT_ADDRESS $BCOIN_UNIT_NAME $TEST_PRIMARY_NODE_DIR]
+ set CCOIN_ASSET_ID [::AlgorandGoal::AssetLookup $PRIMARY_ACCOUNT_ADDRESS $CCOIN_UNIT_NAME $TEST_PRIMARY_NODE_DIR]
+ set DCOIN_ASSET_ID [::AlgorandGoal::AssetLookup $PRIMARY_ACCOUNT_ADDRESS $DCOIN_UNIT_NAME $TEST_PRIMARY_NODE_DIR]
+
+ # Freeze D-Coin
+ ::AlgorandGoal::AssetFreeze $PRIMARY_WALLET_NAME "" $PRIMARY_ACCOUNT_ADDRESS $PRIMARY_ACCOUNT_ADDRESS $DCOIN_ASSET_ID true $TEST_PRIMARY_NODE_DIR
+
+ # wait about 2 rounds
+ puts "Wait $ASSET_WAIT for asset freeze"
+ exec sleep $ASSET_WAIT
+
+ set ASSET_EXPECTED "Created Assets:
+\tID $ACOIN_ASSET_ID, A-Coin, supply 1000 $ACOIN_UNIT_NAME
+\tID $BCOIN_ASSET_ID, , supply 1000 $BCOIN_UNIT_NAME
+\tID $CCOIN_ASSET_ID, C-Coin, supply 1000 units
+\tID $DCOIN_ASSET_ID, D-Coin, supply 10.00 $DCOIN_UNIT_NAME
+Held Assets:
+\tID $ACOIN_ASSET_ID, A-Coin, balance 1000 $ACOIN_UNIT_NAME
+\tID $BCOIN_ASSET_ID, , balance 1000 $BCOIN_UNIT_NAME
+\tID $CCOIN_ASSET_ID, C-Coin, balance 1000 units
+\tID $DCOIN_ASSET_ID, D-Coin, balance 10.00 $DCOIN_UNIT_NAME (frozen)
+Created Apps:
+\t
+Opted In Apps:
+\t"
+
+ # Check info with assets
+ puts "goal account info -w $PRIMARY_WALLET_NAME -a $PRIMARY_ACCOUNT_ADDRESS -d $TEST_PRIMARY_NODE_DIR"
+ set ASSET_ACTUAL [exec goal account info -w $PRIMARY_WALLET_NAME -a $PRIMARY_ACCOUNT_ADDRESS -d $TEST_PRIMARY_NODE_DIR]
+ puts $ASSET_ACTUAL
+
+ if { $ASSET_ACTUAL ne $ASSET_EXPECTED } {
+ ::AlgorandGoal::Abort "Invalid response for account info. Expected:\n$ASSET_EXPECTED"
+ }
+
+ puts "Creating global state app"
+ set GSTATE_GLOBAL_BYTE_SLICES 10
+ set GSTATE_LOCAL_BYTE_SLICES 0
+ set GSTATE_APP_ID [::AlgorandGoal::AppCreate $PRIMARY_WALLET_NAME "" $PRIMARY_ACCOUNT_ADDRESS ${TEAL_PROGS_DIR}/globwrite.teal "str:value_to_write" $GSTATE_GLOBAL_BYTE_SLICES $GSTATE_LOCAL_BYTE_SLICES ${TEAL_PROGS_DIR}/clear_program_state.teal $TEST_PRIMARY_NODE_DIR]
+
+ puts "Creating local state app"
+ set LSTATE_GLOBAL_BYTE_SLICES 0
+ set LSTATE_LOCAL_BYTE_SLICES 1
+ set LSTATE_APP_ID [::AlgorandGoal::AppCreateOnCompletion $PRIMARY_WALLET_NAME "" $PRIMARY_ACCOUNT_ADDRESS ${TEAL_PROGS_DIR}/loccheck.teal "str:write" $LSTATE_GLOBAL_BYTE_SLICES $LSTATE_LOCAL_BYTE_SLICES ${TEAL_PROGS_DIR}/clear_program_state.teal $TEST_PRIMARY_NODE_DIR "optin"]
+
+ # wait about 2 rounds
+ puts "Wait $ASSET_WAIT for app creation"
+ exec sleep $ASSET_WAIT
+
+ set APP_AND_ASSET_EXPECTED "Created Assets:
+\tID $ACOIN_ASSET_ID, A-Coin, supply 1000 $ACOIN_UNIT_NAME
+\tID $BCOIN_ASSET_ID, , supply 1000 $BCOIN_UNIT_NAME
+\tID $CCOIN_ASSET_ID, C-Coin, supply 1000 units
+\tID $DCOIN_ASSET_ID, D-Coin, supply 10.00 $DCOIN_UNIT_NAME
+Held Assets:
+\tID $ACOIN_ASSET_ID, A-Coin, balance 1000 $ACOIN_UNIT_NAME
+\tID $BCOIN_ASSET_ID, , balance 1000 $BCOIN_UNIT_NAME
+\tID $CCOIN_ASSET_ID, C-Coin, balance 1000 units
+\tID $DCOIN_ASSET_ID, D-Coin, balance 10.00 $DCOIN_UNIT_NAME (frozen)
+Created Apps:
+\tID $GSTATE_APP_ID, global state used 0/0 uints, 1/$GSTATE_GLOBAL_BYTE_SLICES byte slices
+\tID $LSTATE_APP_ID, global state used 0/0 uints, 0/$LSTATE_GLOBAL_BYTE_SLICES byte slices
+Opted In Apps:
+\tID $LSTATE_APP_ID, local state used 0/1 uints, 1/$LSTATE_LOCAL_BYTE_SLICES byte slices"
+
+ # Check info with assets and apps
+ puts "goal account info -w $PRIMARY_WALLET_NAME -a $PRIMARY_ACCOUNT_ADDRESS -d $TEST_PRIMARY_NODE_DIR"
+ set APP_AND_ASSET_ACTUAL [exec goal account info -w $PRIMARY_WALLET_NAME -a $PRIMARY_ACCOUNT_ADDRESS -d $TEST_PRIMARY_NODE_DIR]
+ puts $APP_AND_ASSET_ACTUAL
+
+ if { $APP_AND_ASSET_ACTUAL ne $APP_AND_ASSET_EXPECTED } {
+ ::AlgorandGoal::Abort "Invalid response for account info. Expected:\n$APP_AND_ASSET_EXPECTED"
+ }
+
+ # Shutdown the network
+ ::AlgorandGoal::StopNetwork $NETWORK_NAME $TEST_ALGO_DIR $TEST_ROOT_DIR
+
+ puts "Goal Account Info Test Successful"
+
+ exit 0
+
+} EXCEPTION ] } {
+ ::AlgorandGoal::Abort "ERROR in goalAccountInfoTest: $EXCEPTION"
+}
diff --git a/test/e2e-go/cli/goal/expect/goalAppAccountAddressTest.exp b/test/e2e-go/cli/goal/expect/goalAppAccountAddressTest.exp
index 25378849f0..cdef4b936d 100644
--- a/test/e2e-go/cli/goal/expect/goalAppAccountAddressTest.exp
+++ b/test/e2e-go/cli/goal/expect/goalAppAccountAddressTest.exp
@@ -107,8 +107,9 @@ proc goalAppAccountAddress { TEST_ALGO_DIR TEST_DATA_DIR} {
expect {
timeout { puts timeout; ::AlgorandGoal::Abort "\n Failed to see expected output" }
"*committed in round*" {puts "app call successful"; close}
- eof {close; ::AlgorandGoal::Abort "app call failed" }
+ eof {::AlgorandGoal::Abort "app call failed" }
}
+ ::AlgorandGoal::CheckProcessReturnedCode 1
puts "Checking the results"
set EXPECTED_OUTPUT "Account0*$PRIMARY_ACCOUNT_ADDRESS"
@@ -124,20 +125,21 @@ proc goalAppAccountAddress { TEST_ALGO_DIR TEST_DATA_DIR} {
expect {
timeout { puts timeout; ::AlgorandGoal::Abort "\n Failed to see expected output" }
"*$EXPECTED_OUTPUT*" {puts "Local state read correctly"; close}
- eof {close; ::AlgorandGoal::Abort "app read failed" }
+ eof {::AlgorandGoal::Abort "App read failed. Expected output includes: $EXPECTED_OUTPUT" }
}
+ ::AlgorandGoal::CheckProcessReturnedCode 1
# check the local state of account 2
spawn goal app read --app-id $APP_ID --local --guess-format \
--from $ACCOUNT_2_ADDRESS -w $WALLET_1_NAME -d $TEST_PRIMARY_NODE_DIR
-
expect {
timeout { puts timeout; ::AlgorandGoal::Abort "\n Failed to see expected output" }
"Please enter the password for wallet '$WALLET_1_NAME':" {send "$WALLET_1_PASSWORD\r" ; exp_continue}
"*$EXPECTED_OUTPUT*" {puts "Local state read correctly"; close}
- eof {close; ::AlgorandGoal::Abort "app read failed" }
+ eof {::AlgorandGoal::Abort "App read failed. Expected output includes: $EXPECTED_OUTPUT" }
}
-
+ ::AlgorandGoal::CheckProcessReturnedCode 1
+
# call the app with a missing app-account. It should fail
puts "Calling goal app call to get the local state params"
spawn goal app call --app-id $APP_ID --from $PRIMARY_ACCOUNT_ADDRESS -w $PRIMARY_WALLET_NAME -d $TEST_PRIMARY_NODE_DIR \
@@ -145,10 +147,20 @@ proc goalAppAccountAddress { TEST_ALGO_DIR TEST_DATA_DIR} {
--app-account $ACCOUNT_2_ADDRESS \
--app-account $ACCOUNT_4_ADDRESS
expect {
- timeout { puts timeout; ::AlgorandGoal::Abort "\n Failed to see expected output" }
- "*Couldn't broadcast tx with algod: HTTP 400 Bad Request: TransactionPool.Remember: transaction*invalid Accounts index 4*" \
- {puts "Error received successfully "; close}
- eof {close; ::AlgorandGoal::Abort "failed to get the expected error" }
+ timeout { puts timeout; ::AlgorandGoal::Abort "\n Failed to see expected output" }
+ "*Couldn't broadcast tx with algod: HTTP 400 Bad Request: TransactionPool.Remember: transaction*invalid Accounts index 4*" {
+ puts "\nError received successfully "
+ # wait until the eof signal is received
+ expect {
+ timeout { close; ::AlgorandGoal::Abort "failed to see goal terminating after outputing error message" }
+ eof { puts "eof received as expected after error message output" }
+ }
+ }
+ eof {::AlgorandGoal::Abort "failed to get the expected error" }
+ }
+ lassign [::AlgorandGoal::CheckProcessReturnedCode 0] response OS_CODE ERR_CODE KILLED KILL_SIGNAL EXP
+ if {$response != 1 || $OS_CODE != 0 || $ERR_CODE != 1} {
+ ::AlgorandGoal::Abort "failed to get the expected error. Expected ERR_CODE = 1 got ERR_CODE = $ERR_CODE"
}
# Shutdown the network
@@ -171,8 +183,6 @@ if { [catch {
goalAppAccountAddress $TEST_ALGO_DIR $TEST_DATA_DIR
- exit 0
-
} EXCEPTION ] } {
::AlgorandGoal::Abort "ERROR in goalAppAccountAddressTest: $EXCEPTION"
}
diff --git a/test/e2e-go/cli/goal/expect/goalDryrunRestTest.exp b/test/e2e-go/cli/goal/expect/goalDryrunRestTest.exp
index baaf242635..d9cff62725 100644
--- a/test/e2e-go/cli/goal/expect/goalDryrunRestTest.exp
+++ b/test/e2e-go/cli/goal/expect/goalDryrunRestTest.exp
@@ -101,6 +101,27 @@ if { [catch {
timeout { ::AlgorandGoal::Abort "goal app create timeout" }
}
+ # atomic transfer
+ set DRREQ_FILE_4 "$TEST_ROOT_DIR/atomic-tran-drreq.msgp"
+ set AT_TX1_FILE "$TEST_ROOT_DIR/atomic-tran-tx1.mspg"
+ set AT_TX2_FILE "$TEST_ROOT_DIR/atomic-tran-tx2.mspg"
+ set AT_COMBINED_FILE "$TEST_ROOT_DIR/atomic-tran-comb.mspg"
+ set AT_GROUPPED_FILE "$TEST_ROOT_DIR/atomic-tran-group.mspg"
+ spawn goal clerk send --from $PRIMARY_ACCOUNT_ADDRESS --to $PRIMARY_ACCOUNT_ADDRESS -a 1 --fee 1000 -d $TEST_PRIMARY_NODE_DIR -o $AT_TX1_FILE
+ expect {
+ timeout { ::AlgorandGoal::Abort "goal clerk send timeout" }
+ }
+ spawn goal app create --creator $PRIMARY_ACCOUNT_ADDRESS --approval-prog $TEAL_PROG_FILE --clear-prog $TEAL_PROG_FILE --global-byteslices 0 --global-ints 0 --local-byteslices 0 --local-ints 0 -d $TEST_PRIMARY_NODE_DIR -o $AT_TX2_FILE
+ expect {
+ timeout { ::AlgorandGoal::Abort "goal app create timeout" }
+ }
+ exec cat $AT_TX1_FILE $AT_TX2_FILE > $AT_COMBINED_FILE
+ exec goal clerk group -i $AT_COMBINED_FILE -o $AT_GROUPPED_FILE
+ spawn goal clerk dryrun -t $AT_GROUPPED_FILE -d $TEST_PRIMARY_NODE_DIR -o $DRREQ_FILE_4 --dryrun-dump --dryrun-dump-format=msgp
+ expect {
+ timeout { ::AlgorandGoal::Abort "goal clerk dryrun timeout" }
+ }
+
# invalid app
set INVALID_FILE_1 "$TEST_ROOT_DIR/invalid-app.json"
set INVALID_FILE_1_ID [open $INVALID_FILE_1 "w"]
@@ -111,6 +132,8 @@ if { [catch {
TestGoalDryrun $DRREQ_FILE_1 $TEST_PRIMARY_NODE_DIR
TestGoalDryrun $DRREQ_FILE_2 $TEST_PRIMARY_NODE_DIR
TestGoalDryrun $DRREQ_FILE_3 $TEST_PRIMARY_NODE_DIR
+ TestGoalDryrun $DRREQ_FILE_4 $TEST_PRIMARY_NODE_DIR
+
TestGoalDryrunExitCode $DRREQ_FILE_3 $TEST_PRIMARY_NODE_DIR 0 "PASS"
TestGoalDryrunExitCode "" $TEST_PRIMARY_NODE_DIR 1 "Cannot read file : open : no such file or directory"
TestGoalDryrunExitCode $INVALID_FILE_1 $TEST_PRIMARY_NODE_DIR 1 "dryrun-remote: HTTP 400 Bad Request:"
diff --git a/test/e2e-go/cli/goal/expect/goalExpectCommon.exp b/test/e2e-go/cli/goal/expect/goalExpectCommon.exp
index 91272ffba9..96c434e9c8 100755
--- a/test/e2e-go/cli/goal/expect/goalExpectCommon.exp
+++ b/test/e2e-go/cli/goal/expect/goalExpectCommon.exp
@@ -56,6 +56,43 @@ proc ::AlgorandGoal::Abort { ERROR } {
exit 1
}
+# Utility method to test the process returned value
+# Returns 0 when no error code is detected
+# When an error code is detected:
+# If ABORT = 1 Calls AlgorandGoal::Abort
+# if ABORT = 0 Returns 1 OS_CODE ERR_CODE KILLED KILL_SIGNAL EXP
+# If SIGHUP is detected, it ignores it.
+proc ::AlgorandGoal::CheckProcessReturnedCode {ABORT} {
+ upvar spawn_id spawn_id
+ lassign [wait -i $spawn_id] PID SPAWNID OS_CODE ERR_CODE KILLED KILL_SIGNAL EXP
+
+ if {$KILLED == "CHILDKILLED"} {
+ if {$KILL_SIGNAL == "SIGHUP" && $EXP == "hangup"} {
+ # this is caused by expect close. Will ignore.
+ return 0
+ }
+ if {$ABORT} {
+ ::AlgorandGoal::Abort "process killed: $KILL_SIGNAL $EXP"
+ }
+ return [list 1 $OS_CODE $ERR_CODE $KILLED $KILL_SIGNAL $EXP]
+ }
+
+ if {$OS_CODE == -1} {
+ if {$ABORT} {
+ ::AlgorandGoal::Abort "OS error code: $ERR_CODE"
+ }
+ return [list 1 $OS_CODE $ERR_CODE $KILLED $KILL_SIGNAL $EXP]
+ } else {
+ if {$ERR_CODE != 0} {
+ if {$ABORT} {
+ ::AlgorandGoal::Abort "porcess returned non-zero value: $ERR_CODE"
+ }
+ return [list 1 $OS_CODE $ERR_CODE $KILLED $KILL_SIGNAL $EXP]
+ }
+ }
+ return 0
+}
+
# Start the node
proc ::AlgorandGoal::StartNode { TEST_ALGO_DIR {SYSTEMD_MANAGED "False"} {PEER_ADDRESS ""} } {
set ::GLOBAL_TEST_ALGO_DIR $TEST_ALGO_DIR
@@ -163,6 +200,7 @@ proc ::AlgorandGoal::CreateNetwork { NETWORK_NAME NETWORK_TEMPLATE TEST_ALGO_DIR
# Start the network
proc ::AlgorandGoal::StartNetwork { NETWORK_NAME NETWORK_TEMPLATE TEST_ALGO_DIR TEST_ROOT_DIR } {
+ set timeout 120
set ::GLOBAL_TEST_ALGO_DIR $TEST_ALGO_DIR
set ::GLOBAL_TEST_ROOT_DIR $TEST_ROOT_DIR
set ::GLOBAL_NETWORK_NAME $NETWORK_NAME
@@ -414,8 +452,8 @@ proc ::AlgorandGoal::WaitForAccountBalance { WALLET_NAME ACCOUNT_ADDRESS EXPECTE
if { $ACCOUNT_BALANCE == $EXPECTED_BALANCE } {
puts "Account balance OK: $ACCOUNT_BALANCE"; break
} else {
- puts "Account balance: '$ACCOUNT_BALANCE' does not match expected balance: '$EXPECTED_BALANCE'"
- if { $i >= 10 } then { ::AlgorandGoal::Abort "Account balance $ACCOUNT_BALANCE does not match expected amount: $EXPECTED_BALANCE"; break;}
+ puts "Account balance: '$ACCOUNT_BALANCE' does not match expected balance: '$EXPECTED_BALANCE', still waiting..."
+ if { $i >= 20 } then { ::AlgorandGoal::Abort "Account balance '$ACCOUNT_BALANCE' does not match expected amount: '$EXPECTED_BALANCE', waited too long, FAIL"; break;}
}
}
} EXCEPTION ] } {
@@ -425,10 +463,10 @@ proc ::AlgorandGoal::WaitForAccountBalance { WALLET_NAME ACCOUNT_ADDRESS EXPECTE
}
# Create an asset
-proc ::AlgorandGoal::AssetCreate { CREATOR WALLET_NAME WALLET_PASSWORD TOTAL_SUPPLY UNIT_NAME TEST_PRIMARY_NODE_DIR } {
+proc ::AlgorandGoal::AssetCreate { CREATOR WALLET_NAME WALLET_PASSWORD TOTAL_SUPPLY DECIMALS ASSET_NAME UNIT_NAME TEST_PRIMARY_NODE_DIR } {
set timeout 40
if { [ catch {
- spawn goal asset create -d $TEST_PRIMARY_NODE_DIR -w $WALLET_NAME --creator $CREATOR --total $TOTAL_SUPPLY --unitname $UNIT_NAME
+ spawn goal asset create -d $TEST_PRIMARY_NODE_DIR -w $WALLET_NAME --creator $CREATOR --total $TOTAL_SUPPLY --unitname $UNIT_NAME --name $ASSET_NAME --decimals $DECIMALS
expect {
timeout { ::AlgorandGoal::Abort "Timed out create asset" }
"Please enter the password for wallet '$WALLET_NAME':" { send "$WALLET_PASSWORD\r"; exp_continue }
@@ -466,12 +504,26 @@ proc ::AlgorandGoal::CreateAssetTransfer { FROM_ADDR TO_ADDR ASSET_ID ASSET_AMOU
}
}
+# Freeze asset
+proc ::AlgorandGoal::AssetFreeze { WALLET_NAME WALLET_PASSWORD FREEZE_ADDR ACCOUNT_ADDR ASSET_ID FREEZE_VALUE TEST_PRIMARY_NODE_DIR} {
+ if { [ catch {
+ spawn goal asset freeze -d $TEST_PRIMARY_NODE_DIR -w $WALLET_NAME --freezer $FREEZE_ADDR --account $ACCOUNT_ADDR --assetid $ASSET_ID --freeze=$FREEZE_VALUE
+ expect {
+ timeout { ::AlgorandGoal::Abort "Timed out asset transfer" }
+ "Please enter the password for wallet '$WALLET_NAME':" { send "$WALLET_PASSWORD\r"; exp_continue }
+ eof
+ }
+ } EXCEPTION ] } {
+ ::AlgorandGoal::Abort "ERROR in AssetTransfer: $EXCEPTION"
+ }
+}
+
# Get asset id
proc ::AlgorandGoal::AssetLookup { CREATOR UNIT_NAME TEST_PRIMARY_NODE_DIR } {
set timeout 10
if { [ catch {
set ASSET_ID "NOT SET"
- spawn goal asset info -d $TEST_PRIMARY_NODE_DIR --creator $CREATOR --asset $UNIT_NAME
+ spawn goal asset info -d $TEST_PRIMARY_NODE_DIR --creator $CREATOR --unitname $UNIT_NAME
expect {
timeout { ::AlgorandGoal::Abort "Timed out asset lookup" }
-re {Asset ID:\s+([0-9]+)} {set ASSET_ID $expect_out(1,string); close }
@@ -1107,3 +1159,30 @@ proc ::AlgorandGoal::InspectTransactionFile { TRX_FILE } {
eof
}
}
+
+# Run pingpong test
+proc ::AlgorandGoal::RunPingpong {DURATION PINGPONG_OPTIONS TEST_PRIMARY_NODE_DIR} {
+ set timeout [expr $DURATION + 60]
+ if { [ catch {
+ set pingpong_base "pingpong run --duration $DURATION -d $TEST_PRIMARY_NODE_DIR --quiet "
+ set pingpong_command [concat $pingpong_base $PINGPONG_OPTIONS]
+ puts "starting pingpong test with command: $pingpong_command"
+ eval spawn $pingpong_command
+ expect {
+ timeout { puts "pingpong test interrupted by timeout, terminating after $timeout seconds" }
+ -re {Sent (\d+) transactions \((\d+) attempted\).} {
+ set actual $expect_out(1,string) ;
+ set attempted $expect_out(2,string) ;
+ puts "actual: $actual, attempted: $attempted";
+ if { $actual != $attempted } then { ::AlgorandGoal::Abort "Pingpong attempted to send $attempted transactions, but actual was $actual"; break;}
+ exp_continue
+ }
+ "Terminating after max run time of" {puts "end of ping pong test"}
+ eof {::AlgorandGoal::Abort "pingpong terminated unexpectedly: $expect_out(buffer)"}
+ "Error" {::AlgorandGoal::Abort "error running pingpong: $expect_out(buffer)"}
+ }
+ } EXCEPTION ] } {
+ ::AlgorandGoal::Abort "ERROR in RunPingpong: $EXCEPTION"
+ }
+}
+
diff --git a/test/e2e-go/cli/goal/expect/goalFormattingTest.exp b/test/e2e-go/cli/goal/expect/goalFormattingTest.exp
new file mode 100644
index 0000000000..281c53c3db
--- /dev/null
+++ b/test/e2e-go/cli/goal/expect/goalFormattingTest.exp
@@ -0,0 +1,55 @@
+#!/usr/bin/expect -f
+set err 0
+log_user 1
+
+if { [catch {
+
+ source goalExpectCommon.exp
+ set TEST_ALGO_DIR [lindex $argv 0]
+ set TEST_DATA_DIR [lindex $argv 1]
+
+ puts "TEST_ALGO_DIR: $TEST_ALGO_DIR"
+
+ set TIME_STAMP [clock seconds]
+
+ # generate invalid transaction file. ( we want to see that goal is ommitting the control characters when printing out the error message )
+ exec echo {{ "\u001b[0G\u001b[0K\u001b[33munexpected_key\u001b[0m": 2 }} > $TEST_ALGO_DIR/tx.json
+ exec cat $TEST_ALGO_DIR/tx.json | msgpacktool -e -b32 > $TEST_ALGO_DIR/tx
+ exec rm $TEST_ALGO_DIR/tx.json
+
+ set NON_PRINTABLE_CHARS_WARNING 0
+ set CANNOT_DECODE_MESSAGE 0
+ spawn goal clerk inspect $TEST_ALGO_DIR/tx
+ expect {
+ timeout { close; ::AlgorandGoal::Abort "failed to inspect transaction file within timeout" }
+ {One or more non-printable characters were ommited from the following error message:} {
+ set NON_PRINTABLE_CHARS_WARNING 1
+ exp_continue
+ }
+ {Cannot decode transactions from *: msgpack decode error \[pos 33\]: no matching struct field found when decoding stream map with key \[0G\[0K\[33munexpected_key\[0m} {
+ set CANNOT_DECODE_MESSAGE 1
+ exp_continue
+ }
+ eof {
+ if {$CANNOT_DECODE_MESSAGE == 0 || $NON_PRINTABLE_CHARS_WARNING == 0} {
+ puts "eof received before the expected output "
+ exit 1
+ }
+ }
+ }
+
+ lassign [::AlgorandGoal::CheckProcessReturnedCode 0] response OS_CODE ERROR_CODE KILLED KILL_SIGNAL EXP
+ if {$ERROR_CODE != 1} {
+ puts "goal was expected to fail with 1 due to invalid transaction file, but returned error code $ERROR_CODE instead"
+ exit 1
+ }
+
+ exec rm $TEST_ALGO_DIR/tx
+
+ puts "Goal Formatting Test Successful"
+
+ exit 0
+} EXCEPTION] } {
+ puts "ERROR in goalFormattingTest: $EXCEPTION"
+ exit 1
+}
diff --git a/test/e2e-go/cli/goal/expect/goalNodeTest.exp b/test/e2e-go/cli/goal/expect/goalNodeTest.exp
index 2a71aa56d9..ca284ba238 100644
--- a/test/e2e-go/cli/goal/expect/goalNodeTest.exp
+++ b/test/e2e-go/cli/goal/expect/goalNodeTest.exp
@@ -36,6 +36,48 @@ if { [catch {
# Stop node
::AlgorandGoal::StopNode $TEST_PRIMARY_NODE_DIR
+ # Try stopping the node again, should fail
+ spawn goal node stop -d $TEST_PRIMARY_NODE_DIR
+ expect {
+ timeout { close; ::AlgorandGoal::Abort "Goal Node Stop did not fail as expected" }
+ "^Cannot kill node: no running node in directory '*'" {puts "Node failed successfully"; close}
+ eof { close; ::AlgorandGoal::Abort "Goal Node Stop did not fail as expected" }
+ }
+
+ #Try stopping node in invalid directory, should fail
+ spawn goal node stop -d ''
+ expect {
+ timeout { close; ::AlgorandGoal::Abort "Goal Node Fail did not fail as expected" }
+ "^Cannot kill node: the provided directory '*' does not exist" {puts "Node failed successfully"; close}
+ eof { close; ::AlgorandGoal::Abort "Goal Node Stop did not fail as expected" }
+ }
+
+ # "break" the node by replacing it's ledger data files with "broken" ones.
+ lassign [exec find $TEST_PRIMARY_NODE_DIR -name "ledger.tracker.sqlite"] PRIMARY_TRACKER_DATABASE_FILE
+ exec find $TEST_PRIMARY_NODE_DIR -name "ledger.tracker.sqlite*" -delete
+ exec -- echo "1234" > $PRIMARY_TRACKER_DATABASE_FILE
+
+ # try to start the primary node, and observe the expected failure
+ set timeout 15
+ spawn goal node start -d $TEST_PRIMARY_NODE_DIR
+ expect {
+ timeout { close; ::AlgorandGoal::Abort "starting node exceeded timeout" }
+ -re {^Algorand node failed to start: node exited with an error code, check node\.log for more details : exit status 1} {
+ puts "\nExpected failuire : node failed to start"
+ # wait until the eof signal is received
+ expect {
+ timeout { close; ::AlgorandGoal::Abort "failed to see node terminating after outputing error message" }
+ eof { puts "eof received as expected after error message output" }
+ }
+ }
+ eof { ::AlgorandGoal::Abort "eof received before the expected output " }
+ }
+ lassign [::AlgorandGoal::CheckProcessReturnedCode 0] response OS_CODE ERROR_CODE KILLED KILL_SIGNAL EXP
+ if {$ERROR_CODE != 1} {
+ puts "Node was expected to fail with 1 due to invalid ledger file, but returned error code $ERROR_CODE instead"
+ exit 1
+ }
+
# Shutdown the network
::AlgorandGoal::StopNetwork $NETWORK_NAME $TEST_ALGO_DIR $TEST_ROOT_DIR
diff --git a/test/e2e-go/cli/goal/expect/limitOrderTest.exp b/test/e2e-go/cli/goal/expect/limitOrderTest.exp
index 3bacb002b1..a2e4993db7 100644
--- a/test/e2e-go/cli/goal/expect/limitOrderTest.exp
+++ b/test/e2e-go/cli/goal/expect/limitOrderTest.exp
@@ -89,7 +89,7 @@ if { [catch {
# create duckcoin
set TOTAL_SUPPLY 1000000000
set UNIT_NAME "duckcoin"
- ::AlgorandGoal::AssetCreate $ACCOUNT_1_ADDRESS $WALLET_1_NAME $WALLET_1_PASSWORD $TOTAL_SUPPLY $UNIT_NAME $TEST_PRIMARY_NODE_DIR
+ ::AlgorandGoal::AssetCreate $ACCOUNT_1_ADDRESS $WALLET_1_NAME $WALLET_1_PASSWORD $TOTAL_SUPPLY 0 "" $UNIT_NAME $TEST_PRIMARY_NODE_DIR
# wait about 4 rounds
set ASSET_CREATE_WAIT 20
diff --git a/test/e2e-go/cli/goal/expect/pingpongTest.exp b/test/e2e-go/cli/goal/expect/pingpongTest.exp
new file mode 100644
index 0000000000..72b212f418
--- /dev/null
+++ b/test/e2e-go/cli/goal/expect/pingpongTest.exp
@@ -0,0 +1,106 @@
+#!/usr/bin/expect -f
+#exp_internal 1
+set err 0
+log_user 1
+
+source goalExpectCommon.exp
+
+set TEST_ALGO_DIR [lindex $argv 0]
+set TEST_DATA_DIR [lindex $argv 1]
+
+proc pingpongTest { TEST_ALGO_DIR TEST_DATA_DIR} {
+
+ set timeout 60
+ set TIME_STAMP [clock seconds]
+
+ set TEST_ROOT_DIR $TEST_ALGO_DIR/root_$TIME_STAMP
+ set TEST_PRIMARY_NODE_DIR $TEST_ROOT_DIR/Primary/
+ set NETWORK_NAME test_net_expect_$TIME_STAMP
+ set NETWORK_TEMPLATE "$TEST_DATA_DIR/nettemplates/TwoNodes50EachFuture.json"
+
+ exec cp $TEST_DATA_DIR/../../gen/devnet/genesis.json $TEST_ALGO_DIR
+
+ # Create network
+ ::AlgorandGoal::CreateNetwork $NETWORK_NAME $NETWORK_TEMPLATE $TEST_ALGO_DIR $TEST_ROOT_DIR
+
+ # Start network
+ ::AlgorandGoal::StartNetwork $NETWORK_NAME $NETWORK_TEMPLATE $TEST_ALGO_DIR $TEST_ROOT_DIR
+
+ set PRIMARY_NODE_ADDRESS [ ::AlgorandGoal::GetAlgodNetworkAddress $TEST_PRIMARY_NODE_DIR ]
+ puts "Primary Node Address: $PRIMARY_NODE_ADDRESS"
+
+ set PRIMARY_WALLET_NAME unencrypted-default-wallet
+
+ # Determine primary account
+ set PRIMARY_ACCOUNT_ADDRESS [::AlgorandGoal::GetHighestFundedAccountForWallet $PRIMARY_WALLET_NAME $TEST_PRIMARY_NODE_DIR]
+
+ # Check the balance of the primary account
+ set PRIMARY_ACCOUNT_BALANCE [::AlgorandGoal::GetAccountBalance $PRIMARY_WALLET_NAME $PRIMARY_ACCOUNT_ADDRESS $TEST_PRIMARY_NODE_DIR]
+ puts "Primary Account Balance: $PRIMARY_ACCOUNT_BALANCE"
+
+ ::AlgorandGoal::WaitForRound 1 $TEST_PRIMARY_NODE_DIR
+
+ set TEAL_PROGS_DIR "$TEST_DATA_DIR/../scripts/e2e_subs/tealprogs"
+
+ # Network Setup complete
+ #----------------------
+
+ # Run pingpong tests
+ #----------------------
+
+
+ set pingpong_duration 5
+
+ set pingpongArray(1_smallops_smallhash) "--appprogops 2 --appproghashes 2 --appproghashsize sha512_256 --numapp 10 --tps 200 --rest 0 --refresh 10 --numaccounts 5 --minaccount 100000000"
+ set pingpongArray(2_smallops_mediumhash) "--appprogops 2 --appproghashes 5 --appproghashsize sha512_256 --numapp 10 --tps 200 --rest 0 --refresh 10 --numaccounts 50 --minaccount 100000000"
+ set pingpongArray(3_smallops_bighash) "--appprogops 2 --appproghashes 10 --appproghashsize sha512_256 --numapp 10 --tps 200 --rest 0 --refresh 10 --numaccounts 50 --minaccount 100000000"
+ set pingpongArray(4_mediumops_smallhash) "--appprogops 200 --appproghashes 2 --appproghashsize sha512_256 --numapp 10 --tps 200 --rest 0 --refresh 10 --numaccounts 50 --minaccount 100000000"
+ set pingpongArray(5_mediumops_mediumhash) "--appprogops 200 --appproghashes 5 --appproghashsize sha512_256 --numapp 10 --tps 200 --rest 0 --refresh 10 --numaccounts 50 --minaccount 100000000"
+ set pingpongArray(6_mediumops_bighash) "--appprogops 200 --appproghashes 10 --appproghashsize sha512_256 --numapp 10 --tps 200 --rest 0 --refresh 10 --numaccounts 50 --minaccount 100000000"
+ set pingpongArray(7_bigops_smallhash) "--appprogops 500 --appproghashes 2 --appproghashsize sha512_256 --numapp 10 --tps 200 --rest 0 --refresh 10 --numaccounts 50 --minaccount 100000000"
+ set pingpongArray(8_bigops_mediumhash) "--appprogops 300 --appproghashes 5 --appproghashsize sha512_256 --numapp 10 --tps 200 --rest 0 --refresh 10 --numaccounts 50 --minaccount 100000000"
+ set pingpongArray(9_bigops_bighash) "--appprogops 220 --appproghashes 10 --appproghashsize sha512_256 --numapp 10 --tps 200 --rest 0 --refresh 10 --numaccounts 50 --minaccount 100000000"
+
+ set pingpongArray(10_payment_transaction) "--tps 200 --rest 0 --refresh 10 --numaccounts 50"
+ set pingpongArray(11_teal_light_transaction) "--teal=light --tps 200 --rest 0 --refresh 10 --numaccounts 50"
+ set pingpongArray(10_teal_normal_transaction) "--teal=normal --tps 200 --rest 0 --refresh 10 --numaccounts 50"
+ set pingpongArray(12_teal_heavy_transaction) "--teal=heavy --tps 200 --rest 0 --refresh 10 --numaccounts 50"
+ set pingpongArray(13_atomic_transfer_small_transaction) "--groupsize=5 --tps 200 --rest 0 --refresh 10 --numaccounts 50"
+ set pingpongArray(14_atomic_transfer_large_transaction) "--groupsize=12 --tps 200 --rest 0 --refresh 10 --numaccounts 50"
+ set pingpongArray(15_asset_transfer_small_transaction) "--tps 200 --numasset=5 --mf 0 --rest 0 --numaccounts 10 --refresh 10 --mf=1000"
+ set pingpongArray(16_asset_transfer_large_transaction) "--tps 200 --numasset=10 --mf 0 --rest 0 --numaccounts 10 --refresh 10 --mf=1000"
+ set pingpongArray(17_stateful_teal_small_transaction) "--numapp 10 --appprogops 10 --tps 200 --rest 0 --refresh 10 --numaccounts 50 --minaccount 100000000"
+ set pingpongArray(18_stateful_teal_medium_transaction) "--numapp 10 --appprogops 200 --tps 200 --rest 0 --refresh 10 --numaccounts 50 --minaccount 100000000"
+ set pingpongArray(19_stateful_teal_large_transaction) "--numapp 10 --appprogops 600 --tps 200 --rest 0 --refresh 10 --numaccounts 50 --minaccount 100000000"
+ set pingpongArray(20_rekey_payment_transaction) "--rekey=true --groupsize=2 --randomnote=true --tps 200 --rest 0 --refresh 10 --numaccounts 50"
+
+
+ foreach index [array names pingpongArray] {
+ puts "pingpongArray($index): $pingpongArray($index)"
+ ::AlgorandGoal::RunPingpong $pingpong_duration $pingpongArray($index) $TEST_PRIMARY_NODE_DIR
+ }
+
+ # Shutdown the network
+ #----------------------
+ ::AlgorandGoal::StopNetwork $NETWORK_NAME $TEST_ALGO_DIR $TEST_ROOT_DIR
+
+ puts "Pinpong Test Successful"
+
+}
+
+
+if { [catch {
+ source goalExpectCommon.exp
+
+ puts "starting pinpongTest"
+
+ puts "TEST_ALGO_DIR: $TEST_ALGO_DIR"
+ puts "TEST_DATA_DIR: $TEST_DATA_DIR"
+
+ pingpongTest $TEST_ALGO_DIR $TEST_DATA_DIR
+
+ exit 0
+
+} EXCEPTION ] } {
+ ::AlgorandGoal::Abort "ERROR in pinpongTest: $EXCEPTION"
+}
diff --git a/test/e2e-go/cli/goal/expect/testInfraTest.exp b/test/e2e-go/cli/goal/expect/testInfraTest.exp
new file mode 100644
index 0000000000..308ac59166
--- /dev/null
+++ b/test/e2e-go/cli/goal/expect/testInfraTest.exp
@@ -0,0 +1,106 @@
+#!/usr/bin/expect -f
+#exp_internal 1
+set err 0
+log_user 1
+
+source goalExpectCommon.exp
+
+# This test tests the testing procedure CheckProcessReturnedCode
+# When a process crashes, CheckProcessReturnedCode should return 1
+proc checkProcessReturnedCodeTest {} {
+ # Test the process killed branch
+ spawn /bin/bash -c "kill -11 $$"
+ lassign [::AlgorandGoal::CheckProcessReturnedCode 0] response OS_CODE ERR_CODE KILLED KILL_SIGNAL EXP
+ if {$response == 0} {
+ puts "expected failure code 1 not 0"
+ exit 1
+ }
+ if {$KILLED != "CHILDKILLED" || $KILL_SIGNAL != "SIGSEGV" || $EXP != "segmentation violation"} {
+ puts "expected CHILDKILLED SIGSEGV segmentation violation"
+ puts "got: $KILLED $KILL_SIGNAL $EXP"
+ exit 1
+ }
+
+ # Test the sighup branch
+ spawn /bin/bash -c "kill -1 $$"
+ lassign [::AlgorandGoal::CheckProcessReturnedCode 0] response OS_CODE ERR_CODE KILLED KILL_SIGNAL EXP
+ if {$response != 0} {
+ puts "expected 0"
+ puts "got: $KILLED $KILL_SIGNAL $EXP"
+ exit 1
+ }
+
+ # TODO: test OS_CODE == -1 branch
+
+ # test ERR_CODE != 0 branch
+ spawn /bin/bash -c "exit 33"
+ lassign [::AlgorandGoal::CheckProcessReturnedCode 0] response OS_CODE ERR_CODE KILLED KILL_SIGNAL EXP
+ if {$response == 0} {
+ puts "expected failure code 1 not 0"
+ exit 1
+ }
+ if {$ERR_CODE != 33} {
+ puts "expected ERR_CODE 33 got: $ERR_CODE"
+ exit 1
+ }
+
+ # test ERR_CODE == 0 branch
+ spawn /bin/bash -c "exit 0"
+ lassign [::AlgorandGoal::CheckProcessReturnedCode 0] response OS_CODE ERR_CODE KILLED KILL_SIGNAL EXP
+ if {$response != 0} {
+ puts "expected failure code 0 not $response"
+ exit 1
+ }
+
+ # test close sending sighup
+ spawn /bin/bash -c "echo 44; sleep 2s; kill -11 $$"
+ expect {
+ 44 {
+ close
+ }
+ }
+ lassign [::AlgorandGoal::CheckProcessReturnedCode 0] response OS_CODE ERR_CODE KILLED KILL_SIGNAL EXP
+ if {$response != 0} {
+ puts "expected 0"
+ puts "got: $KILLED $KILL_SIGNAL $EXP"
+ exit 1
+ }
+
+ # same, without close. should get to segv
+ spawn /bin/bash -c "echo 44; sleep 2s; kill -11 $$"
+ expect {
+ 44 {
+ puts "not closing"
+ }
+ }
+ lassign [::AlgorandGoal::CheckProcessReturnedCode 0] response OS_CODE ERR_CODE KILLED KILL_SIGNAL EXP
+ if {$KILLED != "CHILDKILLED" || $KILL_SIGNAL != "SIGSEGV" || $EXP != "segmentation violation"} {
+ puts "expected CHILDKILLED SIGSEGV segmentation violation"
+ puts "got: $KILLED $KILL_SIGNAL $EXP"
+ exit 1
+ }
+}
+
+# When eof is expected, the spawn_id is no longer open
+# This test confirms this behavior
+proc closeOnEofTest {} {
+ spawn /bin/bash -c "echo this is some command"
+ expect {
+ eof {
+ if {[catch {
+ close
+ } EXCEPTION] } {
+ if {![string match {spawn_id: spawn id * not open} $EXCEPTION]} {
+ puts "expected: spawn_id: spawn id expID not open"
+ puts "got: $EXCEPTION"
+ exit 1
+ }
+ }
+ }
+ }
+
+}
+
+
+checkProcessReturnedCodeTest
+closeOnEofTest
diff --git a/test/e2e-go/cli/tealdbg/cdtmock/main.go b/test/e2e-go/cli/tealdbg/cdtmock/main.go
new file mode 100644
index 0000000000..90c9fad5bf
--- /dev/null
+++ b/test/e2e-go/cli/tealdbg/cdtmock/main.go
@@ -0,0 +1,131 @@
+// Copyright (C) 2019-2020 Algorand, Inc.
+// This file is part of go-algorand
+//
+// go-algorand is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// go-algorand is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with go-algorand. If not, see .
+
+package main
+
+import (
+ "fmt"
+
+ "net/http"
+ "os"
+ "strings"
+ "time"
+
+ "github.com/algorand/websocket"
+
+ "github.com/algorand/go-algorand/cmd/tealdbg/cdt"
+)
+
+type wsClient struct {
+ conn *websocket.Conn
+ received bool
+}
+
+func (c *wsClient) Connect(url string) error {
+ var websocketDialer = websocket.Dialer{
+ HandshakeTimeout: 45 * time.Second,
+ EnableCompression: false,
+ }
+
+ requestHeader := make(http.Header)
+ conn, _, err := websocketDialer.Dial(url, requestHeader)
+ if err != nil {
+ return err
+ }
+ c.conn = conn
+ return nil
+}
+
+func (c *wsClient) SendJSON(data interface{}) error {
+ return c.conn.WriteJSON(data)
+}
+
+func (c *wsClient) Receive(buf []byte) (int, error) {
+ if !c.received {
+ c.conn.SetReadLimit(2 * 1024 * 1024)
+ c.received = true
+ }
+ _, msg, err := c.conn.ReadMessage()
+ if err != nil && !strings.HasSuffix(err.Error(), "close 1000 (normal)") {
+ return 0, err
+ }
+ copy(buf, msg)
+ return len(msg), nil
+}
+
+func (c *wsClient) Close() {
+ c.conn.WriteControl(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""), time.Now().Add(5*time.Second))
+ c.conn.CloseWithoutFlush()
+}
+
+func main() {
+ if len(os.Args) < 2 {
+ fmt.Printf("Usage: %s \n", os.Args[0])
+ os.Exit(1)
+ }
+ url := os.Args[1]
+
+ var client wsClient
+ var err error
+ data := make([]byte, 1024)
+
+ if err = client.Connect(url); err != nil {
+ fmt.Printf("Connect error: %v\n", err)
+ os.Exit(1)
+ }
+
+ var counter int64 = 1
+ req := cdt.ChromeRequest{ID: counter, Method: "Debugger.Enable"}
+ counter++
+
+ if err = client.SendJSON(req); err != nil {
+ fmt.Printf("Send error: %v", err)
+ os.Exit(1)
+ }
+ if _, err = client.Receive(data); err != nil {
+ fmt.Printf("Recv error: %v", err)
+ os.Exit(1)
+ }
+ fmt.Printf("%s\n", string(data))
+
+ req = cdt.ChromeRequest{ID: counter, Method: "Runtime.runIfWaitingForDebugger"}
+ counter++
+
+ if err = client.SendJSON(req); err != nil {
+ fmt.Printf("Send error: %v", err)
+ os.Exit(1)
+ }
+ if _, err = client.Receive(data); err != nil {
+ fmt.Printf("Recv error: %v", err)
+ os.Exit(1)
+ }
+ fmt.Printf("%s\n", string(data))
+
+ req = cdt.ChromeRequest{ID: counter, Method: "Debugger.resume"}
+ counter++
+
+ if err = client.SendJSON(req); err != nil {
+ fmt.Printf("Send error: %v", err)
+ os.Exit(1)
+ }
+ if _, err = client.Receive(data); err != nil {
+ fmt.Printf("Recv error: %v", err)
+ os.Exit(1)
+ }
+ fmt.Printf("%s\n", string(data))
+
+ client.Close()
+}
diff --git a/test/e2e-go/cli/tealdbg/expect/tealdbgSpinoffTest.exp b/test/e2e-go/cli/tealdbg/expect/tealdbgSpinoffTest.exp
new file mode 100644
index 0000000000..d18315cdc8
--- /dev/null
+++ b/test/e2e-go/cli/tealdbg/expect/tealdbgSpinoffTest.exp
@@ -0,0 +1,61 @@
+#!/usr/bin/expect -f
+set err 0
+log_user 1
+
+if { [catch {
+
+ set TEST_ALGO_DIR [lindex $argv 0]
+ set timeout 30
+
+ set TEST_DIR $TEST_ALGO_DIR
+ exec mkdir -p $TEST_DIR
+
+ # this is simple escrow logic sig txn in form of dryrun request
+ # it is hardcoded to do not start a network so that speedup the test a bit
+ set DR_ENCODED_FILE "$TEST_DIR/drreq.base64"
+ set DR_FILE "$TEST_DIR/drreq.msgp"
+ exec echo "h6hhY2NvdW50c8CkYXBwc8CwbGF0ZXN0LXRpbWVzdGFtcACwcHJvdG9jb2wtdmVyc2lvbqClcm91bmQAp3NvdXJjZXPApHR4bnORgqRsc2lngaFsxAUCIAEAIqN0eG6Ko2FtdM0D6KNmZWXNA+iiZnbOAIouvaNnZW6sdGVzdG5ldC12MS4womdoxCBIY7UYpLPITsgQ8i1PEIHLD3HwWaesIN7GL39w5Qk6IqJsds4AijKlpG5vdGXECNUWZX6OlD7Yo3JjdsQgpyYUTlC0jaNxDE4C5LyEF3fcPjIrI6STeWXGbGv02ISjc25kxCCnJhROULSNo3EMTgLkvIQXd9w+MisjpJN5ZcZsa/TYhKR0eXBlo3BheQ==" > $DR_ENCODED_FILE
+ exec cat $DR_ENCODED_FILE | base64 --decode > $DR_FILE
+
+ set URL_SPINOFF ""
+ set URL_WS ""
+ set PASSED 0
+ spawn tealdbg debug -q
+ expect_background {
+ timeout { puts "tealdbg debug timed out"; exit 1 }
+ -re {listening for upcoming dryrun requests at (http://[.a-z0-9:/]+)} { set URL_SPINOFF $expect_out(1,string); }
+ }
+
+ # wait until URL is set or timeout
+ set it 0
+ while { $it < 10 && $URL_SPINOFF == "" } {
+ set it [expr {$it + 1}]
+ sleep 1
+ }
+ if { $URL_SPINOFF == "" } {
+ puts "ERROR: SPINOFF URL is not set after timeout"
+ exit 1
+ }
+
+ spawn curl -X POST $URL_SPINOFF -H'Content-Type: octet/stream' --data-binary @$DR_FILE
+ expect {
+ timeout { puts "curl timed out"; exit 1 }
+ -re {(ws://[.a-z0-9:/]+)} { set URL_WS $expect_out(1,string); }
+ }
+
+ spawn cdtmock $URL_WS
+ expect {
+ timeout { puts "cdt-mock debug timed out"; exit 1 }
+ -re {Debugger.paused} { set PASSED 1; }
+ eof { catch wait result; if { [lindex $result 3] == 0 } { puts "Expected non-zero exit code"; exit [lindex $result 3] } }
+ }
+
+ if { $PASSED == 0 } {
+ puts "ERROR: have not found 'Debugger.paused' in cdtmock output"
+ exit 1
+ }
+
+} EXCEPTION ] } {
+ puts "ERROR in teadbgTest: $EXCEPTION"
+ exit 1
+}
diff --git a/test/e2e-go/cli/tealdbg/expect/tealdbgTest.exp b/test/e2e-go/cli/tealdbg/expect/tealdbgTest.exp
new file mode 100644
index 0000000000..57b0fb4052
--- /dev/null
+++ b/test/e2e-go/cli/tealdbg/expect/tealdbgTest.exp
@@ -0,0 +1,50 @@
+#!/usr/bin/expect -f
+set err 0
+log_user 1
+
+if { [catch {
+
+ set TEST_ALGO_DIR [lindex $argv 0]
+ set timeout 30
+
+ set TEST_DIR $TEST_ALGO_DIR
+ exec mkdir -p $TEST_DIR
+
+ set TEAL_PROG_FILE "$TEST_DIR/trivial.teal"
+ exec printf "#pragma version 2\nint 1\ndup\n+\n" > $TEAL_PROG_FILE
+
+ set URL ""
+ set PASSED 0
+ spawn tealdbg debug -v $TEAL_PROG_FILE
+ expect_background {
+ timeout { puts "tealdbg debug timed out"; exit 1 }
+ -re {CDT debugger listening on: (ws://[.a-z0-9:/]+)} { set URL $expect_out(1,string); }
+ }
+
+ # wait until URL is set or timeout
+ set it 0
+ while { $it < 10 && $URL == "" } {
+ set it [expr {$it + 1}]
+ sleep 1
+ }
+ if { $URL == "" } {
+ puts "ERROR: URL is not set after timeout"
+ exit 1
+ }
+
+ spawn cdtmock $URL
+ expect {
+ timeout { puts "cdt-mock debug timed out"; exit 1 }
+ -re {Debugger.paused} { set PASSED 1; }
+ eof { catch wait result; if { [lindex $result 3] == 0 } { puts "Expected non-zero exit code"; exit [lindex $result 3] } }
+ }
+
+ if { $PASSED == 0 } {
+ puts "ERROR: have not found 'Debugger.paused' in cdtmock output"
+ exit 1
+ }
+
+} EXCEPTION ] } {
+ puts "ERROR in teadbgTest: $EXCEPTION"
+ exit 1
+}
diff --git a/test/e2e-go/cli/tealdbg/expect/tealdbg_expect_test.go b/test/e2e-go/cli/tealdbg/expect/tealdbg_expect_test.go
new file mode 100644
index 0000000000..7dd648dcdc
--- /dev/null
+++ b/test/e2e-go/cli/tealdbg/expect/tealdbg_expect_test.go
@@ -0,0 +1,28 @@
+// Copyright (C) 2019-2020 Algorand, Inc.
+// This file is part of go-algorand
+//
+// go-algorand is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// go-algorand is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with go-algorand. If not, see .
+package expect
+
+import (
+ "testing"
+
+ "github.com/algorand/go-algorand/test/framework/fixtures"
+)
+
+// TestTealdbgWithExpect processes all expect script files with suffix Test.exp within the test/e2e-go/cli/tealdbg/expect directory
+func TestTealdbgWithExpect(t *testing.T) {
+ et := fixtures.MakeExpectTest(t)
+ et.Run()
+}
diff --git a/test/e2e-go/features/catchup/catchpointCatchup_test.go b/test/e2e-go/features/catchup/catchpointCatchup_test.go
index 3ade3d372e..16de802892 100644
--- a/test/e2e-go/features/catchup/catchpointCatchup_test.go
+++ b/test/e2e-go/features/catchup/catchpointCatchup_test.go
@@ -19,7 +19,6 @@ package catchup
import (
"fmt"
"net/http"
- "os"
"os/exec"
"path/filepath"
"runtime"
@@ -86,11 +85,6 @@ func TestBasicCatchpointCatchup(t *testing.T) {
a := require.New(t)
log := logging.TestingLog(t)
- if runtime.GOARCH == "amd64" {
- // amd64 platforms are generally quite capable, so exceletate the round times to make the test run faster.
- os.Setenv("ALGOSMALLLAMBDAMSEC", "500")
- }
-
// Overview of this test:
// Start a two-node network (primary has 100%, secondary has 0%)
// Nodes are having a consensus allowing balances history of 32 rounds and transaction history of 33 rounds.
@@ -110,6 +104,12 @@ func TestBasicCatchpointCatchup(t *testing.T) {
catchpointCatchupProtocol.MaxBalLookback = 2 * catchpointCatchupProtocol.SeedLookback * catchpointCatchupProtocol.SeedRefreshInterval // 32
catchpointCatchupProtocol.MaxTxnLife = 33
+ if runtime.GOARCH == "amd64" {
+ // amd64 platforms are generally quite capable, so accelerate the round times to make the test run faster.
+ catchpointCatchupProtocol.AgreementFilterTimeoutPeriod0 = 1 * time.Second
+ catchpointCatchupProtocol.AgreementFilterTimeout = 1 * time.Second
+ }
+
consensus[consensusCatchpointCatchupTestProtocol] = catchpointCatchupProtocol
var fixture fixtures.RestClientFixture
diff --git a/test/e2e-go/features/transactions/accountv2_test.go b/test/e2e-go/features/transactions/accountv2_test.go
index 7827a1f141..56fdd44244 100644
--- a/test/e2e-go/features/transactions/accountv2_test.go
+++ b/test/e2e-go/features/transactions/accountv2_test.go
@@ -17,9 +17,9 @@
package transactions
import (
- "os"
"path/filepath"
"testing"
+ "time"
"github.com/stretchr/testify/require"
@@ -38,11 +38,9 @@ func TestAccountInformationV2(t *testing.T) {
var fixture fixtures.RestClientFixture
proto, ok := config.Consensus[protocol.ConsensusFuture]
a.True(ok)
- os.Setenv("ALGOSMALLLAMBDAMSEC", "200")
+ proto.AgreementFilterTimeoutPeriod0 = 400 * time.Millisecond
+ proto.AgreementFilterTimeout = 400 * time.Millisecond
fixture.SetConsensus(config.ConsensusProtocols{protocol.ConsensusFuture: proto})
- defer func() {
- os.Unsetenv("ALGOSMALLLAMBDAMSEC")
- }()
fixture.Setup(t, filepath.Join("nettemplates", "TwoNodes50EachFuture.json"))
defer fixture.Shutdown()
@@ -66,7 +64,7 @@ func TestAccountInformationV2(t *testing.T) {
// Fund the manager, so it can issue transactions later on
_, err = client.SendPaymentFromUnencryptedWallet(creator, user, fee, 10000000000, nil)
a.NoError(err)
- client.WaitForRound(round + 2)
+ client.WaitForRound(round + 4)
// There should be no apps to start with
ad, err := client.AccountData(creator)
diff --git a/test/e2e-go/features/transactions/transactionPool_test.go b/test/e2e-go/features/transactions/transactionPool_test.go
index fbcb272983..2103bb25dd 100644
--- a/test/e2e-go/features/transactions/transactionPool_test.go
+++ b/test/e2e-go/features/transactions/transactionPool_test.go
@@ -39,9 +39,8 @@ func TestTransactionPoolOrderingAndClearing(t *testing.T) {
// stop the other node in this network so that no new blocks are produced
otherNode, err := fixture.GetNodeController("Node")
r.NoError(err, "should be able to get other node's controller")
- alreadyStopped, err := otherNode.StopAlgod()
+ err = otherNode.StopAlgod()
r.NoError(err, "should be able to stop other node")
- r.False(alreadyStopped, "other node should have been running when it was stopped")
// get the round that the network was stopped on, it will be used when the network restarts
curStatus, _ := c.Status()
stoppedRound := curStatus.LastRound
@@ -126,9 +125,8 @@ func TestTransactionPoolExponentialFees(t *testing.T) {
// stop the other node in this network so that no new blocks are produced
otherNode, err := fixture.GetNodeController("Node")
r.NoError(err, "should be able to get other node's controller")
- alreadyStopped, err := otherNode.StopAlgod()
+ err = otherNode.StopAlgod()
r.NoError(err, "should be able to stop other node")
- r.False(alreadyStopped, "other node should have been running when it was stopped")
// put transactions in the pool - they cannot be removed from the pool while the node is stopped
transactionPoolSize := 50000
sourceAccount, err := fixture.GetRichestAccount()
diff --git a/test/e2e-go/perf/basic_test.go b/test/e2e-go/perf/basic_test.go
index e275740118..78370c8614 100644
--- a/test/e2e-go/perf/basic_test.go
+++ b/test/e2e-go/perf/basic_test.go
@@ -51,7 +51,7 @@ func queuePayments(b *testing.B, wg *sync.WaitGroup, c libgoal.Client, q <-chan
}
fmt.Printf("Error broadcasting transaction: %v\n", err)
- time.Sleep(2 * config.Protocol.SmallLambda)
+ time.Sleep(config.Consensus[protocol.ConsensusCurrentVersion].AgreementFilterTimeout)
}
}
diff --git a/test/e2e-go/upgrades/application_support_test.go b/test/e2e-go/upgrades/application_support_test.go
index fa1ca6943d..2717fae961 100644
--- a/test/e2e-go/upgrades/application_support_test.go
+++ b/test/e2e-go/upgrades/application_support_test.go
@@ -17,8 +17,6 @@
package upgrades
import (
- "fmt"
- "os"
"path/filepath"
"testing"
"time"
@@ -67,18 +65,7 @@ func makeApplicationUpgradeConsensus(t *testing.T) (appConsensus config.Consensu
// to a version that supports applications. It verify that prior to supporting applications, the node would not accept
// any application transaction and after the upgrade is complete, it would support that.
func TestApplicationsUpgradeOverREST(t *testing.T) {
- // set the small lambda to 500 for the duration of this test.
- roundTimeMs := 500
- lambda := os.Getenv("ALGOSMALLLAMBDAMSEC")
- os.Setenv("ALGOSMALLLAMBDAMSEC", fmt.Sprintf("%d", roundTimeMs))
- defer func() {
- if lambda == "" {
- os.Unsetenv("ALGOSMALLLAMBDAMSEC")
- } else {
- os.Setenv("ALGOSMALLLAMBDAMSEC", lambda)
- }
- }()
-
+ smallLambdaMs := 500
consensus := makeApplicationUpgradeConsensus(t)
var fixture fixtures.RestClientFixture
@@ -177,7 +164,7 @@ int 1
require.NoError(t, err)
require.Less(t, int64(time.Now().Sub(startLoopTime)), int64(3*time.Minute))
- time.Sleep(time.Duration(roundTimeMs) * time.Millisecond)
+ time.Sleep(time.Duration(smallLambdaMs) * time.Millisecond)
round = curStatus.LastRound
}
@@ -291,18 +278,7 @@ int 1
// to a version that supports applications. It verify that prior to supporting applications, the node would not accept
// any application transaction and after the upgrade is complete, it would support that.
func TestApplicationsUpgradeOverGossip(t *testing.T) {
- // set the small lambda to 500 for the duration of this test.
- roundTimeMs := 500
- lambda := os.Getenv("ALGOSMALLLAMBDAMSEC")
- os.Setenv("ALGOSMALLLAMBDAMSEC", fmt.Sprintf("%d", roundTimeMs))
- defer func() {
- if lambda == "" {
- os.Unsetenv("ALGOSMALLLAMBDAMSEC")
- } else {
- os.Setenv("ALGOSMALLLAMBDAMSEC", lambda)
- }
- }()
-
+ smallLambdaMs := 500
consensus := makeApplicationUpgradeConsensus(t)
var fixture fixtures.RestClientFixture
@@ -436,7 +412,7 @@ int 1
require.NoError(t, err)
require.Less(t, int64(time.Now().Sub(startLoopTime)), int64(3*time.Minute))
- time.Sleep(time.Duration(roundTimeMs) * time.Millisecond)
+ time.Sleep(time.Duration(smallLambdaMs) * time.Millisecond)
round = curStatus.LastRound
}
diff --git a/test/e2e-go/upgrades/rekey_support_test.go b/test/e2e-go/upgrades/rekey_support_test.go
index 88d6d7c0b7..d3263e0717 100644
--- a/test/e2e-go/upgrades/rekey_support_test.go
+++ b/test/e2e-go/upgrades/rekey_support_test.go
@@ -17,8 +17,6 @@
package upgrades
import (
- "fmt"
- "os"
"path/filepath"
"testing"
"time"
@@ -33,18 +31,7 @@ import (
func TestRekeyUpgrade(t *testing.T) {
a := require.New(t)
- // set the small lambda to 500 for the duration of this test.
- roundTimeMs := 500
- lambda := os.Getenv("ALGOSMALLLAMBDAMSEC")
- os.Setenv("ALGOSMALLLAMBDAMSEC", fmt.Sprintf("%d", roundTimeMs))
- defer func() {
- if lambda == "" {
- os.Unsetenv("ALGOSMALLLAMBDAMSEC")
- } else {
- os.Setenv("ALGOSMALLLAMBDAMSEC", lambda)
- }
- }()
-
+ smallLambdaMs := 500
consensus := makeApplicationUpgradeConsensus(t)
var fixture fixtures.RestClientFixture
@@ -108,7 +95,7 @@ func TestRekeyUpgrade(t *testing.T) {
require.NoError(t, err)
require.Less(t, int64(time.Now().Sub(startLoopTime)), int64(3*time.Minute))
- time.Sleep(time.Duration(roundTimeMs) * time.Millisecond)
+ time.Sleep(time.Duration(smallLambdaMs) * time.Millisecond)
round = curStatus.LastRound
}
diff --git a/test/e2e-go/upgrades/send_receive_upgrade_test.go b/test/e2e-go/upgrades/send_receive_upgrade_test.go
index 817324ac46..6cd8f115ba 100644
--- a/test/e2e-go/upgrades/send_receive_upgrade_test.go
+++ b/test/e2e-go/upgrades/send_receive_upgrade_test.go
@@ -18,7 +18,6 @@ package upgrades
import (
"math/rand"
- "os"
"path/filepath"
"testing"
"time"
@@ -117,6 +116,10 @@ func generateFastUpgradeConsensus() (fastUpgradeProtocols config.ConsensusProtoc
}
fastUpgradeProtocols[consensusTestFastUpgrade(proto)] = fastParams
+
+ // set the small lambda to 500 for the duration of dependent tests.
+ fastParams.AgreementFilterTimeout = time.Second
+ fastParams.AgreementFilterTimeoutPeriod0 = time.Second
}
return
}
@@ -124,7 +127,6 @@ func generateFastUpgradeConsensus() (fastUpgradeProtocols config.ConsensusProtoc
func testAccountsCanSendMoneyAcrossUpgrade(t *testing.T, templatePath string) {
t.Parallel()
a := require.New(t)
- os.Setenv("ALGOSMALLLAMBDAMSEC", "500")
consensus := generateFastUpgradeConsensus()
diff --git a/test/framework/fixtures/auctionFixture.go b/test/framework/fixtures/auctionFixture.go
index b4e8251996..1d4b9b85c6 100644
--- a/test/framework/fixtures/auctionFixture.go
+++ b/test/framework/fixtures/auctionFixture.go
@@ -47,6 +47,7 @@ import (
"github.com/algorand/go-algorand/libgoal"
"github.com/algorand/go-algorand/logging"
"github.com/algorand/go-algorand/protocol"
+ "github.com/algorand/go-algorand/util"
)
const (
@@ -221,7 +222,7 @@ func (f *AuctionFixture) Stop(pidFile string) error {
return err
}
- err = syscall.Kill(int(pid), syscall.SIGTERM)
+ err = util.KillProcess(int(pid), syscall.SIGTERM)
if err != nil {
f.t.Errorf("Unable to kill PID: %d", pid)
return err
@@ -235,7 +236,7 @@ func (f *AuctionFixture) Stop(pidFile string) error {
}
select {
case <-waitLong:
- return syscall.Kill(int(pid), syscall.SIGKILL)
+ return util.KillProcess(int(pid), syscall.SIGKILL)
case <-time.After(time.Millisecond * 100):
}
}
diff --git a/test/muleCI/Jenkinsfile b/test/muleCI/Jenkinsfile
index 361781be91..ff8a41ec42 100644
--- a/test/muleCI/Jenkinsfile
+++ b/test/muleCI/Jenkinsfile
@@ -1,3 +1,3 @@
@Library('go-algorand-ci') _
-muleCI('test/muleCI/mule.yaml', '0.0.9')
\ No newline at end of file
+muleCI('test/muleCI/mule.yaml', '0.0.12')
diff --git a/test/muleCI/mule.yaml b/test/muleCI/mule.yaml
index 4c419f1f33..35fb059adb 100644
--- a/test/muleCI/mule.yaml
+++ b/test/muleCI/mule.yaml
@@ -1,4 +1,83 @@
+agents:
+ - name: cicd.ubuntu.amd64
+ dockerFilePath: docker/build/cicd.ubuntu.Dockerfile
+ image: algorand/go-algorand-ci-linux-ubuntu
+ version: scripts/configure_dev-deps.sh
+ arch: amd64
+ env:
+ - TRAVIS_BRANCH=${GIT_BRANCH}
+ buildArgs:
+ - GOLANG_VERSION=`./scripts/get_golang_version.sh`
+ - ARCH=amd64
+ - name: cicd.centos.amd64
+ dockerFilePath: docker/build/cicd.centos.Dockerfile
+ image: algorand/go-algorand-ci-linux-centos
+ version: scripts/configure_dev-deps.sh
+ arch: amd64
+ env:
+ - TRAVIS_BRANCH=${GIT_BRANCH}
+ buildArgs:
+ - GOLANG_VERSION=`./scripts/get_golang_version.sh`
+ - ARCH=amd64
+ - name: cicd.ubuntu.arm64
+ dockerFilePath: docker/build/cicd.ubuntu.Dockerfile
+ image: algorand/go-algorand-ci-linux-ubuntu
+ version: scripts/configure_dev-deps.sh
+ arch: arm64v8
+ env:
+ - TRAVIS_BRANCH=${GIT_BRANCH}
+ buildArgs:
+ - GOLANG_VERSION=`./scripts/get_golang_version.sh`
+ - ARCH=arm64v8
+ - name: cicd.alpine.arm
+ dockerFilePath: docker/build/cicd.alpine.Dockerfile
+ image: algorand/go-algorand-ci-linux
+ version: scripts/configure_dev-deps.sh
+ arch: arm32v6
+ env:
+ - TRAVIS_BRANCH=${GIT_BRANCH}
+ buildArgs:
+ - GOLANG_VERSION=`./scripts/get_golang_version.sh`
+ - ARCH=arm32v6
+ - name: docker-ubuntu
+ dockerFilePath: docker/build/docker.ubuntu.Dockerfile
+ image: algorand/go-algorand-docker-linux-ubuntu
+ version: scripts/configure_dev-deps.sh
+ env:
+ - TRAVIS_BRANCH=${GIT_BRANCH}
+ buildArgs:
+ - GOLANG_VERSION=`./scripts/get_golang_version.sh`
+ volumes:
+ - /var/run/docker.sock:/var/run/docker.sock
+
tasks:
+ - task: docker.Make
+ name: build.amd64
+ agent: cicd.ubuntu.amd64
+ target: ci-build
+ - task: docker.Make
+ name: build.arm64
+ agent: cicd.ubuntu.arm64
+ target: ci-build
+ - task: docker.Make
+ name: build.arm
+ agent: cicd.alpine.arm
+ target: ci-build
+
+ - task: docker.Make
+ name: archive.amd64
+ agent: cicd.centos.amd64
+ target: archive
+
+ - task: docker.Make
+ name: rpm.amd64
+ agent: cicd.centos.amd64
+ target: mule-package-rpm
+ - task: docker.Make
+ name: deb.amd64
+ agent: cicd.ubuntu.amd64
+ target: mule-package-deb
+
# Stash tasks
- task: stash.Stash
name: linux-amd64
@@ -6,7 +85,6 @@ tasks:
stashId: ${JENKINS_JOB_CACHE_ID}/linux-amd64
globSpecs:
- tmp/node_pkgs/**
- - crypto/libs/**
- gen/devnet/genesis.json
- gen/testnet/genesis.json
- gen/mainnet/genesis.json
@@ -16,7 +94,6 @@ tasks:
stashId: ${JENKINS_JOB_CACHE_ID}/darwin-amd64
globSpecs:
- tmp/node_pkgs/**
- - crypto/libs/**
- gen/devnet/genesis.json
- gen/testnet/genesis.json
- gen/mainnet/genesis.json
@@ -26,22 +103,26 @@ tasks:
stashId: ${JENKINS_JOB_CACHE_ID}/linux-arm64
globSpecs:
- tmp/node_pkgs/**
- - crypto/libs/**
- gen/devnet/genesis.json
- gen/testnet/genesis.json
- gen/mainnet/genesis.json
- task: stash.Stash
- name: linux-arm32
+ name: linux-arm
bucketName: go-algorand-ci-cache
- stashId: ${JENKINS_JOB_CACHE_ID}/linux-arm32
+ stashId: ${JENKINS_JOB_CACHE_ID}/linux-arm
globSpecs:
- tmp/node_pkgs/**
- - crypto/libs/**
- gen/devnet/genesis.json
- gen/testnet/genesis.json
- gen/mainnet/genesis.json
+ - task: stash.Stash
+ name: packages
+ bucketName: go-algorand-ci-cache
+ stashId: ${JENKINS_JOB_CACHE_ID}/packages
+ globSpecs:
+ - tmp/node_pkgs/**
- # Unstash tasks
+ # Unstash tasks
- task: stash.Unstash
name: linux-arm64
bucketName: go-algorand-ci-cache
@@ -55,145 +136,46 @@ tasks:
bucketName: go-algorand-ci-cache
stashId: ${JENKINS_JOB_CACHE_ID}/darwin-amd64
- task: stash.Unstash
- name: linux-arm32
+ name: linux-arm
bucketName: go-algorand-ci-cache
- stashId: ${JENKINS_JOB_CACHE_ID}/linux-arm32
+ stashId: ${JENKINS_JOB_CACHE_ID}/linux-arm
+ - task: stash.Unstash
+ name: packages
+ bucketName: go-algorand-ci-cache
+ stashId: ${JENKINS_JOB_CACHE_ID}/packages
- # Docker tasks
- - task: docker.Version
- configFilePath: scripts/configure_dev-deps.sh
- - task: shell.docker.Ensure
- name: centos
- image: algorand/go-algorand-ci-linux
- version: '{{ docker.Version.outputs.version }}'
- dockerFilePath: docker/build/cicd.centos.Dockerfile
- dependencies: docker.Version
- - task: shell.docker.Ensure
- name: alpine
- image: algorand/go-algorand-ci-linux
- version: '{{ docker.Version.outputs.version }}'
- dockerFilePath: docker/build/cicd.alpine.Dockerfile
- dependencies: docker.Version
- - task: docker.Make
- name: build
- docker:
- image: algorand/go-algorand-ci-linux
- version: '{{ docker.Version.outputs.version }}'
- workDir: /go/src/github.com/algorand/go-algorand
- target: ci-build
- - task: docker.Make
- name: fulltest
- docker:
- image: algorand/go-algorand-ci-linux
- version: '{{ docker.Version.outputs.version }}'
- workDir: /go/src/github.com/algorand/go-algorand
- target: fulltest -j4
- task: docker.Make
- name: integration-test
- docker:
- env:
- - SHORTTEST=-short
- image: algorand/go-algorand-ci-linux
- version: '{{ docker.Version.outputs.version }}'
- workDir: /go/src/github.com/algorand/go-algorand
- target: ci-integration -j4
- - task: docker.Make
- name: archive
- docker:
- image: algorand/go-algorand-ci-linux
- version: '{{ docker.Version.outputs.version }}'
- workDir: /go/src/github.com/algorand/go-algorand
- target: ci-archive
-
- # Local Tasks
- - task: shell.Make
- name: ci-deps build
- target: ci-build
- - task: shell.Make
- name: fulltest
- target: fulltest -j4
- - task: shell.Make
- name: integration-test
- target: ci-integration -j4
- - task: shell.Make
- name: archive
- target: archive
+ name: docker-image
+ agent: docker-ubuntu
+ target: mule-package-docker
jobs:
- # Linux amd64 jobs
build-linux-amd64:
- configs:
- arch: amd64
tasks:
- - shell.docker.Ensure.centos
- - docker.Make.build
+ - docker.Make.build.amd64
- stash.Stash.linux-amd64
- test-linux-amd64-integration:
- configs:
- arch: amd64
- tasks:
- - shell.docker.Ensure.centos
- - stash.Unstash.linux-amd64
- - docker.Make.integration-test
- test-linux-amd64-fulltest:
- configs:
- arch: amd64
- tasks:
- - shell.docker.Ensure.centos
- - docker.Make.fulltest
-
- # Darwin amd64 jobs
-# build-darwin-amd64:
-# configs:
-# arch: amd64
-# tasks:
-# - shell.Make.build
-# - stash.Stash.darwin-amd64
-# test-darwin-amd64-integration:
-# configs:
-# arch: amd64
-# tasks:
-# - stash.Unstash.darwin-amd64
-# - shell.Make.integration-test
-# test-darwin-amd64-fulltest:
-# configs:
-# arch: amd64
-# tasks:
-# - shell.Make.fulltest
-
- # Linux arm64 jobs
build-linux-arm64:
- configs:
- arch: arm64v8
tasks:
- - shell.docker.Ensure.centos
- - docker.Make.build
+ - docker.Make.build.arm64
- stash.Stash.linux-arm64
- test-linux-arm64-integration:
- configs:
- arch: arm64v8
- tasks:
- - shell.docker.Ensure.centos
- - stash.Unstash.linux-arm64
- - docker.Make.integration-test
-
- # Linux arm32 jobs
build-linux-arm32:
- configs:
- arch: arm32v6
tasks:
- - shell.docker.Ensure.alpine
- - docker.Make.build
- - stash.Stash.linux-arm32
-
- # Archive jobs
- archive-linux-amd64:
- configs:
- arch: amd64
+ - docker.Make.build.arm
+ - stash.Stash.linux-arm
+
+ package-linux-amd64:
tasks:
- - shell.docker.Ensure.centos
- stash.Unstash.linux-amd64
- # - stash.Unstash.darwin-amd64
- stash.Unstash.linux-arm64
- - stash.Unstash.linux-arm32
- - docker.Make.archive
+ - stash.Unstash.linux-arm
+ - docker.Make.deb.amd64
+ - docker.Make.rpm.amd64
+ - stash.Stash.packages
+ archive-linux-amd64:
+ tasks:
+ - stash.Unstash.packages
+ - docker.Make.archive.amd64
+
+ package-docker:
+ tasks:
+ - docker.Make.docker-image
diff --git a/test/scripts/e2e_subs/e2e-app-real-assets-round.sh b/test/scripts/e2e_subs/e2e-app-real-assets-round.sh
index 6793d6bb53..19314fa8d4 100755
--- a/test/scripts/e2e_subs/e2e-app-real-assets-round.sh
+++ b/test/scripts/e2e_subs/e2e-app-real-assets-round.sh
@@ -18,7 +18,7 @@ ACCOUNT=$(${gcmd} account list|awk '{ print $3 }')
# Create an ASA in account
${gcmd} asset create --creator ${ACCOUNT} --name bogocoin --unitname bogo --total 1337
-ASSET_ID=$(${gcmd} asset info --creator $ACCOUNT --asset bogo|grep 'Asset ID'|awk '{ print $3 }')
+ASSET_ID=$(${gcmd} asset info --creator $ACCOUNT --unitname bogo|grep 'Asset ID'|awk '{ print $3 }')
# Create app that reads asset balance and checks asset details and checks round
ROUND=$(goal node status | grep 'Last committed' | awk '{ print $4 }')
diff --git a/test/scripts/e2e_subs/e2e-teal.sh b/test/scripts/e2e_subs/e2e-teal.sh
index 59517b336c..367e4186d1 100755
--- a/test/scripts/e2e_subs/e2e-teal.sh
+++ b/test/scripts/e2e_subs/e2e-teal.sh
@@ -18,9 +18,9 @@ ACCOUNT=$(${gcmd} account list|awk '{ print $3 }')
ACCOUNTB=$(${gcmd} account new|awk '{ print $6 }')
ROUND=$(goal node status | grep 'Last committed block:'|awk '{ print $4 }')
-TIMEOUT_ROUND=$((${ROUND} + 7))
+TIMEOUT_ROUND=$((${ROUND} + 14))
-# timeout after 7 rounds
+# timeout after 14 rounds
python ${GOPATH}/src/github.com/algorand/go-algorand/data/transactions/logic/tlhc.py --from ${ACCOUNT} --to ${ACCOUNTB} --timeout-round ${TIMEOUT_ROUND} > ${TEMPDIR}/tlhc.teal 2> ${TEMPDIR}/tlhc.teal.secret
cat ${TEMPDIR}/tlhc.teal
diff --git a/test/scripts/e2e_subs/keyreg-teal-test.sh b/test/scripts/e2e_subs/keyreg-teal-test.sh
index 0dde49eaab..f5f0ee2719 100755
--- a/test/scripts/e2e_subs/keyreg-teal-test.sh
+++ b/test/scripts/e2e_subs/keyreg-teal-test.sh
@@ -16,8 +16,8 @@ ACCOUNTA=$(${gcmd} account new|awk '{ print $6 }')
ACCOUNTB=$(${gcmd} account new|awk '{ print $6 }')
LEASE=YmxhaCBibGFoIGxlYXNlIHdoYXRldmVyIGJsYWghISE=
-DUR=4
-PERIOD=4
+DUR=8
+PERIOD=8
EXPIRE=10000
FEE=100000
diff --git a/test/scripts/e2e_subs/limit-swap-test.sh b/test/scripts/e2e_subs/limit-swap-test.sh
index 52907b47ff..dd3d6fef90 100755
--- a/test/scripts/e2e_subs/limit-swap-test.sh
+++ b/test/scripts/e2e_subs/limit-swap-test.sh
@@ -16,7 +16,7 @@ ZERO_ADDRESS=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ
${gcmd} asset create --creator ${ACCOUNT} --name bogocoin --unitname bogo --total 1000000000000
-ASSET_ID=$(${gcmd} asset info --creator $ACCOUNT --asset bogo|grep 'Asset ID'|awk '{ print $3 }')
+ASSET_ID=$(${gcmd} asset info --creator $ACCOUNT --unitname bogo|grep 'Asset ID'|awk '{ print $3 }')
# Asset ID: 5
diff --git a/test/scripts/e2e_subs/periodic-teal-test.sh b/test/scripts/e2e_subs/periodic-teal-test.sh
index 35ffe62325..8880af1437 100755
--- a/test/scripts/e2e_subs/periodic-teal-test.sh
+++ b/test/scripts/e2e_subs/periodic-teal-test.sh
@@ -16,13 +16,13 @@ ACCOUNTB=$(${gcmd} account new|awk '{ print $6 }')
ZERO_ADDRESS=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ
LEASE=YmxhaCBibGFoIGxlYXNlIHdoYXRldmVyIGJsYWghISE=
-sed s/TMPL_RCV/${ACCOUNTB}/g < ${GOPATH}/src/github.com/algorand/go-algorand/tools/teal/templates/periodic-payment-escrow.teal.tmpl | sed s/TMPL_PERIOD/5/g | sed s/TMPL_DUR/2/g | sed s/TMPL_AMT/1000000/g | sed s/TMPL_LEASE/${LEASE}/g | sed s/TMPL_TIMEOUT/16/g | sed s/TMPL_FEE/10000/g > ${TEMPDIR}/periodic.teal
+sed s/TMPL_RCV/${ACCOUNTB}/g < ${GOPATH}/src/github.com/algorand/go-algorand/tools/teal/templates/periodic-payment-escrow.teal.tmpl | sed s/TMPL_PERIOD/5/g | sed s/TMPL_DUR/2/g | sed s/TMPL_AMT/100000/g | sed s/TMPL_LEASE/${LEASE}/g | sed s/TMPL_TIMEOUT/16/g | sed s/TMPL_FEE/10000/g > ${TEMPDIR}/periodic.teal
ACCOUNT_PERIODIC=$(${gcmd} clerk compile ${TEMPDIR}/periodic.teal -o ${TEMPDIR}/periodic.tealc|awk '{ print $2 }')
ROUND=5
DUR_ROUND=$((${ROUND} + 2))
-${gcmd} clerk send -a 1000000 -t ${ACCOUNTB} --from-program ${TEMPDIR}/periodic.teal --firstvalid ${ROUND} --lastvalid ${DUR_ROUND} -x ${LEASE} -o ${TEMPDIR}/a.tx
+${gcmd} clerk send -a 100000 -t ${ACCOUNTB} --from-program ${TEMPDIR}/periodic.teal --firstvalid ${ROUND} --lastvalid ${DUR_ROUND} -x ${LEASE} -o ${TEMPDIR}/a.tx
${gcmd} clerk dryrun -t ${TEMPDIR}/a.tx
${gcmd} clerk send -a 1000000000 -f ${ACCOUNT} -t ${ACCOUNT_PERIODIC}
@@ -38,7 +38,7 @@ while [ $sendcount -lt 3 ]; do
fi
ROUND=$(goal node status | grep 'Last committed block:'|awk '{ print $4 }')
DUR_ROUND=$((${ROUND} + 2))
- if ${gcmd} clerk send -a 1000000 -t ${ACCOUNTB} --from-program ${TEMPDIR}/periodic.teal --firstvalid ${ROUND} --lastvalid ${DUR_ROUND} -x ${LEASE}; then
+ if ${gcmd} clerk send -a 100000 -t ${ACCOUNTB} --from-program ${TEMPDIR}/periodic.teal --firstvalid ${ROUND} --lastvalid ${DUR_ROUND} -x ${LEASE}; then
sendcount=$(($sendcount + 1))
date '+periodic-teal-test sent one at ${ROUND} %Y%m%d_%H%M%S'
fi
@@ -47,7 +47,7 @@ done
BALANCEB=$(${gcmd} account balance -a ${ACCOUNTB}|awk '{ print $1 }')
-if [ $BALANCEB -ne 3000000 ]; then
+if [ $BALANCEB -ne 300000 ]; then
date '+periodic-teal-test FAIL wanted balance=3000000 but got ${BALANCEB} %Y%m%d_%H%M%S'
false
fi
diff --git a/test/scripts/e2e_subs/rest.sh b/test/scripts/e2e_subs/rest.sh
index 037579205f..3f915406b0 100755
--- a/test/scripts/e2e_subs/rest.sh
+++ b/test/scripts/e2e_subs/rest.sh
@@ -16,6 +16,9 @@ PUB_TOKEN=$(cat "$ALGORAND_DATA"/algod.token)
ADMIN_TOKEN=$(cat "$ALGORAND_DATA"/algod.admin.token)
NET=$(cat "$ALGORAND_DATA"/algod.net)
+PRIMARY_NET=$(cat "$ALGORAND_DATA2"/algod.net)
+PRIMARY_ADMIN_TOKEN=$(cat "$ALGORAND_DATA2"/algod.admin.token)
+
function base_call {
curl -o "$3" -w "%{http_code}" -q -s -H "Authorization: Bearer $1" "$NET$2"
@@ -112,7 +115,44 @@ function test_assets_endpoint {
call_and_verify "Asset invalid parameter" "/v2/assets/$ASSET_ID?this-should-fail=200" 400 'parameter detected: this-should-fail'
}
+function pprof_test {
+ # URL Auth - valid
+ CODE=$(curl -o "${TEMPDIR}/curl_out.txt" -w "%{http_code}" -q -s "$PRIMARY_NET/urlAuth/$PRIMARY_ADMIN_TOKEN/debug/pprof/block")
+ if [[ "$CODE" != "200" ]]; then
+ fail_and_exit "Call pprof with valid token" "/urlAuth/:token/debug/pprof" "Invalid exit code expected 200 (actual $CODE)"
+ fi
+
+ # URL Auth - invalid
+ CODE=$(curl -o "${TEMPDIR}/curl_out.txt" -w "%{http_code}" -q -s "$PRIMARY_NET/urlAuth/invalid_token/debug/pprof/block")
+ if [[ "$CODE" != "401" ]]; then
+ fail_and_exit "Call pprof with invalid token" "/urlAuth/invalid_token/debug/pprof" "Invalid exit code expected 401 (actual $CODE)"
+ fi
+
+ # Header Auth - valid
+ CODE=$(curl -o "${TEMPDIR}/curl_out.txt" -w "%{http_code}" -q -s "$PRIMARY_NET/debug/pprof/block" -H "Authorization: Bearer $PRIMARY_ADMIN_TOKEN")
+ if [[ "$CODE" != "200" ]]; then
+ fail_and_exit "Call pprof with valid token" "/debug/pprof" "Invalid exit code expected 200 (actual $CODE)"
+ fi
+
+ # Header Auth - invalid
+ CODE=$(curl -o "${TEMPDIR}/curl_out.txt" -w "%{http_code}" -q -s "$PRIMARY_NET/debug/pprof/block" -H "Authorization: Bearer invalid_token")
+ if [[ "$CODE" != "401" ]]; then
+ fail_and_exit "Call pprof with invalid token" "/debug/pprof" "Invalid exit code expected 401 (actual $CODE)"
+ fi
+}
+
+function test_genesis_endpoint {
+ call_and_verify "There should be a genesis endpoint." "/genesis" 200 '
+ "id": "v1",
+ "network": "tbd",
+ "proto": "future",
+ "rwd": "7777777777777777777777777777777777777777777777777774MSJUVU"
+}'
+}
+
# Run the tests.
test_applications_endpoint
test_assets_endpoint
+pprof_test
+test_genesis_endpoint
diff --git a/test/testdata/consensus/catchpointtestingprotocol.json b/test/testdata/consensus/catchpointtestingprotocol.json
index f6c587cfc2..05c0f2dd9d 100644
--- a/test/testdata/consensus/catchpointtestingprotocol.json
+++ b/test/testdata/consensus/catchpointtestingprotocol.json
@@ -33,6 +33,8 @@
"RedoCommitteeThreshold": 1768,
"DownCommitteeSize": 6000,
"DownCommitteeThreshold": 4560,
+ "AgreementFilterTimeout": 1000000000,
+ "AgreementFilterTimeoutPeriod0": 1000000000,
"FastRecoveryLambda": 300000000000,
"FastPartitionRecovery": true,
"PaysetCommitFlat": true,
diff --git a/test/testdata/deployednettemplates/generate-recipe/generate_network.py b/test/testdata/deployednettemplates/generate-recipe/generate_network.py
new file mode 100755
index 0000000000..0804f7d96c
--- /dev/null
+++ b/test/testdata/deployednettemplates/generate-recipe/generate_network.py
@@ -0,0 +1,163 @@
+#!/usr/bin/env python3
+import json
+import argparse
+import math
+import subprocess
+import shutil
+import os
+
+def build_network(template):
+ with open(template) as f:
+ template_dict = json.load(f)
+
+ template_path = os.path.abspath(os.path.dirname(args.template))
+ script_path = os.path.dirname(__file__)
+ topology = build_topology(template_dict)
+
+ gen_dir = f"{template_path}/generated"
+ if not os.path.isdir(gen_dir):
+ os.mkdir(gen_dir)
+
+ shutil.copy(f"{script_path}/recipe.json", f"{template_path}/recipe.json")
+
+ with open(f"{template_path}/generated/topology.json", 'w') as topology_file:
+ json.dump(topology, topology_file, indent=4)
+
+ netgoal_params = build_netgoal_params(template_dict)
+ build_net(template_path, netgoal_params)
+ build_genesis(template_path, netgoal_params)
+
+def build_netgoal_params(template_dict):
+ instances = template_dict['instances']
+
+ relay_count = 0
+ participating_node_count = 0
+ non_participating_node_count = 0
+
+ for group in template_dict['groups']:
+ relay_count += getInstanceCount(instances['relays'], group['percent']['relays'])
+ participating_node_count += getInstanceCount(instances['participatingNodes'], group['percent']['participatingNodes'])
+ non_participating_node_count += getInstanceCount(instances['nonParticipatingNodes'], group['percent']['nonParticipatingNodes'])
+
+
+ relay_config = instances['relays']['config']
+ participating_node_config = instances['participatingNodes']['config']
+ non_participating_node_config = instances['nonParticipatingNodes']['config']
+
+ wallets_count = template_dict['network']['wallets']
+ nodes_count = template_dict['network']['nodes']
+
+ return [
+ '-w', str(wallets_count),
+ '-R', str(relay_count),
+ '-N', str(participating_node_count),
+ '-H', str(non_participating_node_count),
+ '-n', str(nodes_count),
+ '--relay-template', relay_config,
+ '--node-template', participating_node_config,
+ '--non-participating-node-template', non_participating_node_config
+ ]
+
+def build_net(template_path, netgoal_params):
+ args = [
+ '-t', 'net',
+ '-o', f"{template_path}/generated/net.json"
+ ]
+ args.extend(netgoal_params)
+ netgoal(args, template_path)
+
+def build_genesis(template_path, netgoal_params):
+ args = [
+ '-t', 'genesis',
+ '-o', f"{template_path}/generated/genesis.json"
+ ]
+ args.extend(netgoal_params)
+ netgoal(args, template_path)
+
+def netgoal(args, template_path='.'):
+ cmd = [
+ 'netgoal', 'generate',
+ '-r', '/dev/null'
+ ]
+ cmd.extend(args)
+ subprocess.run(cmd, cwd=template_path)
+
+def build_topology(template_dict):
+
+ instances = template_dict['instances']
+ groups = template_dict['groups']
+
+ hosts = build_hosts(instances, groups)
+ return {
+ 'Hosts': hosts
+ }
+
+def build_hosts(instances, groups):
+ relays = []
+ participating_nodes = []
+ non_participating_nodes = []
+
+ relay_cfg = instances['relays']
+ participating_node_cfg = instances['participatingNodes']
+ non_participating_node_cfg = instances['nonParticipatingNodes']
+
+ for group in groups:
+ for i in range(getInstanceCount(relay_cfg, group['percent']['relays'])):
+ relays.append({
+ "Name": f"R{len(relays) + 1}",
+ "Group": group['name'],
+ "Template": f"AWS-{group['region'].upper()}-{relay_cfg['type']}"
+ })
+ for i in range(getInstanceCount(participating_node_cfg, group['percent']['participatingNodes'])):
+ participating_nodes.append({
+ "Name": f"N{len(participating_nodes) + 1}",
+ "Group": group['name'],
+ "Template": f"AWS-{group['region'].upper()}-{participating_node_cfg['type']}"
+ })
+ for i in range(getInstanceCount(non_participating_node_cfg, group['percent']['nonParticipatingNodes'])):
+ non_participating_nodes.append({
+ "Name": f"NPN{len(non_participating_nodes) + 1}",
+ "Group": group['name'],
+ "Template": f"AWS-{group['region'].upper()}-{non_participating_node_cfg['type']}"
+ })
+
+ hosts = []
+ hosts.extend(relays)
+ hosts.extend(participating_nodes)
+ hosts.extend(non_participating_nodes)
+ return hosts
+
+def getInstanceCount(instance, percent):
+ if (percent == 0):
+ return 0
+ total_instance_count = instance['count']
+ instance_count = math.floor(total_instance_count * percent / 100)
+ return max(instance_count, 1)
+
+
+def validate_template(template_dict):
+ groups = template_dict['groups']
+ total_percent = 0
+ for group in groups:
+ total_percent += groups['percent']
+ if total_percent != 100:
+ raise Exception(f"Total percentages of groups expected 100, got {total_percent}")
+
+parser = argparse.ArgumentParser(
+ description="",
+)
+
+parser.add_argument(
+ '-f',
+ '--template',
+ help = 'Path to network template',
+ required=True
+)
+
+args = parser.parse_args()
+
+if os.path.isfile(args.template):
+ build_network(args.template)
+else:
+ print(f"Expected --template option to be set with a path to a network template, was {args.template}")
+ exit(2)
diff --git a/test/testdata/deployednettemplates/generate-recipe/recipe.json b/test/testdata/deployednettemplates/generate-recipe/recipe.json
new file mode 100644
index 0000000000..24f7b394e0
--- /dev/null
+++ b/test/testdata/deployednettemplates/generate-recipe/recipe.json
@@ -0,0 +1,7 @@
+{
+ "GenesisFile":"generated/genesis.json",
+ "NetworkFile":"generated/net.json",
+ "ConfigFile": "../../configs/reference.json",
+ "HostTemplatesFile": "../../hosttemplates/hosttemplates.json",
+ "TopologyFile": "generated/topology.json"
+}
diff --git a/test/testdata/deployednettemplates/hosttemplates/hosttemplates.json b/test/testdata/deployednettemplates/hosttemplates/hosttemplates.json
index 627ed4772a..66484f38bd 100644
--- a/test/testdata/deployednettemplates/hosttemplates/hosttemplates.json
+++ b/test/testdata/deployednettemplates/hosttemplates/hosttemplates.json
@@ -1,5 +1,11 @@
{
"Hosts": [
+ {
+ "Name": "AWS-US-WEST-1-c5.xlarge",
+ "Provider": "AWS",
+ "Region": "us-west-1",
+ "BaseConfiguration": "c5.xlarge"
+ },
{
"Name": "AWS-US-WEST-1-Small",
"Provider": "AWS",
@@ -12,6 +18,12 @@
"Region": "us-west-1",
"BaseConfiguration": "c5.4xlarge"
},
+ {
+ "Name": "AWS-US-WEST-1-m5d.large",
+ "Provider": "AWS",
+ "Region": "us-west-1",
+ "BaseConfiguration": "m5d.large"
+ },
{
"Name": "AWS-US-WEST-1-m5d.2xl",
"Provider": "AWS",
@@ -30,6 +42,12 @@
"Region": "us-west-1",
"BaseConfiguration": "c5d.9xlarge"
},
+ {
+ "Name": "AWS-US-WEST-2-c5.xlarge",
+ "Provider": "AWS",
+ "Region": "us-west-2",
+ "BaseConfiguration": "c5.xlarge"
+ },
{
"Name": "AWS-US-WEST-2-Small",
"Provider": "AWS",
@@ -60,6 +78,12 @@
"Region": "us-west-2",
"BaseConfiguration": "c5d.9xlarge"
},
+ {
+ "Name": "AWS-US-EAST-1-c5.xlarge",
+ "Provider": "AWS",
+ "Region": "us-east-1",
+ "BaseConfiguration": "c5.xlarge"
+ },
{
"Name": "AWS-US-EAST-1-T2-Large",
"Provider": "AWS",
@@ -96,6 +120,12 @@
"Region": "us-east-1",
"BaseConfiguration": "c5d.9xlarge"
},
+ {
+ "Name": "AWS-US-EAST-2-c5.xlarge",
+ "Provider": "AWS",
+ "Region": "us-east-2",
+ "BaseConfiguration": "c5.xlarge"
+ },
{
"Name": "AWS-US-EAST-2-Small",
"Provider": "AWS",
@@ -126,6 +156,12 @@
"Region": "us-east-2",
"BaseConfiguration": "c5d.9xlarge"
},
+ {
+ "Name": "AWS-AP-SOUTH-1-c5.xlarge",
+ "Provider": "AWS",
+ "Region": "ap-south-1",
+ "BaseConfiguration": "c5.xlarge"
+ },
{
"Name": "AWS-AP-SOUTH-1-Small",
"Provider": "AWS",
@@ -156,6 +192,12 @@
"Region": "ap-south-1",
"BaseConfiguration": "c5d.9xlarge"
},
+ {
+ "Name": "AWS-AP-SOUTHEAST-1-c5.xlarge",
+ "Provider": "AWS",
+ "Region": "ap-southeast-1",
+ "BaseConfiguration": "c5.xlarge"
+ },
{
"Name": "AWS-AP-SOUTHEAST-1-Small",
"Provider": "AWS",
@@ -186,6 +228,12 @@
"Region": "ap-southeast-1",
"BaseConfiguration": "c5d.9xlarge"
},
+ {
+ "Name": "AWS-AP-SOUTHEAST-2-c5.xlarge",
+ "Provider": "AWS",
+ "Region": "ap-southeast-2",
+ "BaseConfiguration": "c5.xlarge"
+ },
{
"Name": "AWS-AP-SOUTHEAST-2-Small",
"Provider": "AWS",
@@ -216,6 +264,12 @@
"Region": "ap-southeast-2",
"BaseConfiguration": "c5d.9xlarge"
},
+ {
+ "Name": "AWS-AP-NORTHEAST-1-c5.xlarge",
+ "Provider": "AWS",
+ "Region": "ap-northeast-1",
+ "BaseConfiguration": "c5.xlarge"
+ },
{
"Name": "AWS-AP-NORTHEAST-1-Small",
"Provider": "AWS",
@@ -228,6 +282,12 @@
"Region": "ap-northeast-1",
"BaseConfiguration": "c5.4xlarge"
},
+ {
+ "Name": "AWS-AP-NORTHEAST-2-c5.xlarge",
+ "Provider": "AWS",
+ "Region": "ap-northeast-2",
+ "BaseConfiguration": "c5.xlarge"
+ },
{
"Name": "AWS-AP-NORTHEAST-2-Small",
"Provider": "AWS",
@@ -240,6 +300,12 @@
"Region": "ap-northeast-2",
"BaseConfiguration": "c5.4xlarge"
},
+ {
+ "Name": "AWS-EU-CENTRAL-1-c5.xlarge",
+ "Provider": "AWS",
+ "Region": "eu-central-1",
+ "BaseConfiguration": "c5.xlarge"
+ },
{
"Name": "AWS-EU-CENTRAL-1-Small",
"Provider": "AWS",
@@ -270,6 +336,12 @@
"Region": "eu-central-1",
"BaseConfiguration": "c5d.9xlarge"
},
+ {
+ "Name": "AWS-EU-WEST-1-c5.xlarge",
+ "Provider": "AWS",
+ "Region": "eu-west-1",
+ "BaseConfiguration": "c5.xlarge"
+ },
{
"Name": "AWS-EU-WEST-1-Small",
"Provider": "AWS",
@@ -300,6 +372,12 @@
"Region": "eu-west-1",
"BaseConfiguration": "c5d.9xlarge"
},
+ {
+ "Name": "AWS-EU-WEST-2-c5.xlarge",
+ "Provider": "AWS",
+ "Region": "eu-west-2",
+ "BaseConfiguration": "c5.xlarge"
+ },
{
"Name": "AWS-EU-WEST-2-Small",
"Provider": "AWS",
@@ -330,6 +408,12 @@
"Region": "eu-west-2",
"BaseConfiguration": "c5d.9xlarge"
},
+ {
+ "Name": "AWS-EU-WEST-3-c5.xlarge",
+ "Provider": "AWS",
+ "Region": "eu-west-3",
+ "BaseConfiguration": "c5.xlarge"
+ },
{
"Name": "AWS-EU-WEST-3-Small",
"Provider": "AWS",
@@ -360,6 +444,12 @@
"Region": "eu-west-3",
"BaseConfiguration": "c5d.9xlarge"
},
+ {
+ "Name": "AWS-EU-NORTH-1-c5.xlarge",
+ "Provider": "AWS",
+ "Region": "eu-north-1",
+ "BaseConfiguration": "c5.xlarge"
+ },
{
"Name": "AWS-EU-NORTH-1-Small",
"Provider": "AWS",
@@ -372,6 +462,12 @@
"Region": "eu-north-1",
"BaseConfiguration": "c5.4xlarge"
},
+ {
+ "Name": "AWS-SA-EAST-1-c5.xlarge",
+ "Provider": "AWS",
+ "Region": "sa-east-1",
+ "BaseConfiguration": "c5.xlarge"
+ },
{
"Name": "AWS-SA-EAST-1-Small",
"Provider": "AWS",
@@ -402,6 +498,12 @@
"Region": "sa-east-1",
"BaseConfiguration": "c5d.9xlarge"
},
+ {
+ "Name": "AWS-CA-CENTRAL-1-c5.xlarge",
+ "Provider": "AWS",
+ "Region": "ca-central-1",
+ "BaseConfiguration": "c5.xlarge"
+ },
{
"Name": "AWS-CA-CENTRAL-1-m5d.2xl",
"Provider": "AWS",
diff --git a/test/testdata/deployednettemplates/recipes/mainnet-model/Makefile b/test/testdata/deployednettemplates/recipes/mainnet-model/Makefile
new file mode 100644
index 0000000000..780b5931d9
--- /dev/null
+++ b/test/testdata/deployednettemplates/recipes/mainnet-model/Makefile
@@ -0,0 +1,8 @@
+all: network_performance_rules
+
+network_performance_rules: generate_network_rules.js data/bandwidth.json data/countries.json data/latency.json configs/node.json configs/nonPartNode.json configs/relay.json
+ node generate_network_rules.js
+ ../../generate-recipe/generate_network.py --template ./network-tpl.json
+
+clean:
+ rm -f network_performance_rules
diff --git a/test/testdata/deployednettemplates/recipes/mainnet-model/configs/node.json b/test/testdata/deployednettemplates/recipes/mainnet-model/configs/node.json
new file mode 100644
index 0000000000..7749558800
--- /dev/null
+++ b/test/testdata/deployednettemplates/recipes/mainnet-model/configs/node.json
@@ -0,0 +1,22 @@
+{
+ "APIToken": "{{APIToken}}",
+ "EnableBlockStats": false,
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }",
+ "AltConfigs": [
+ {
+ "APIToken": "{{APIToken}}",
+ "EnableBlockStats": true,
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }",
+ "FractionApply": 0.2
+ }
+ ]
+}
+
diff --git a/test/testdata/deployednettemplates/recipes/mainnet-model/configs/nonPartNode.json b/test/testdata/deployednettemplates/recipes/mainnet-model/configs/nonPartNode.json
new file mode 100644
index 0000000000..3825bb420b
--- /dev/null
+++ b/test/testdata/deployednettemplates/recipes/mainnet-model/configs/nonPartNode.json
@@ -0,0 +1,5 @@
+{
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"BaseLoggerDebugLevel\": 4 }"
+}
diff --git a/test/testdata/deployednettemplates/recipes/mainnet-model/configs/relay.json b/test/testdata/deployednettemplates/recipes/mainnet-model/configs/relay.json
new file mode 100644
index 0000000000..25bb6b5a26
--- /dev/null
+++ b/test/testdata/deployednettemplates/recipes/mainnet-model/configs/relay.json
@@ -0,0 +1,11 @@
+{
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableBlockStats": true,
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+}
diff --git a/test/testdata/deployednettemplates/recipes/mainnet-model/data/bandwidth.json b/test/testdata/deployednettemplates/recipes/mainnet-model/data/bandwidth.json
new file mode 100644
index 0000000000..ff688163ab
--- /dev/null
+++ b/test/testdata/deployednettemplates/recipes/mainnet-model/data/bandwidth.json
@@ -0,0 +1,698 @@
+[
+ [
+ "Singapore",
+ 218.07
+ ],
+ [
+ "Hong Kong",
+ 205.69
+ ],
+ [
+ "Romania",
+ 175.39
+ ],
+ [
+ "Thailand",
+ 173.41
+ ],
+ [
+ "Switzerland",
+ 170.67
+ ],
+ [
+ "Liechtenstein",
+ 164.47
+ ],
+ [
+ "Monaco",
+ 164.31
+ ],
+ [
+ "South Korea",
+ 159.98
+ ],
+ [
+ "France",
+ 158.44
+ ],
+ [
+ "Hungary",
+ 156.66
+ ],
+ [
+ "United States",
+ 156.61
+ ],
+ [
+ "Macau",
+ 151.86
+ ],
+ [
+ "Denmark",
+ 151.23
+ ],
+ [
+ "Sweden",
+ 150.73
+ ],
+ [
+ "Spain",
+ 145.73
+ ],
+ [
+ "Canada",
+ 140.40
+ ],
+ [
+ "China",
+ 139.76
+ ],
+ [
+ "Norway",
+ 137.72
+ ],
+ [
+ "Luxembourg",
+ 135.48
+ ],
+ [
+ "New Zealand",
+ 129.97
+ ],
+ [
+ "Andorra",
+ 129.69
+ ],
+ [
+ "Chile",
+ 128.95
+ ],
+ [
+ "Japan",
+ 127.09
+ ],
+ [
+ "Taiwan",
+ 125.46
+ ],
+ [
+ "Netherlands",
+ 120.46
+ ],
+ [
+ "United Arab Emirates",
+ 119.14
+ ],
+ [
+ "Portugal",
+ 117.44
+ ],
+ [
+ "Lithuania",
+ 117.13
+ ],
+ [
+ "Kuwait",
+ 113.12
+ ],
+ [
+ "Israel",
+ 111.32
+ ],
+ [
+ "Malta",
+ 110.67
+ ],
+ [
+ "Latvia",
+ 107.03
+ ],
+ [
+ "Poland",
+ 106.52
+ ],
+ [
+ "Germany",
+ 106.41
+ ],
+ [
+ "Finland",
+ 101.92
+ ],
+ [
+ "Panama",
+ 98.59
+ ],
+ [
+ "San Marino",
+ 97.48
+ ],
+ [
+ "Belgium",
+ 95.90
+ ],
+ [
+ "Barbados",
+ 95.36
+ ],
+ [
+ "Qatar",
+ 90.80
+ ],
+ [
+ "Malaysia",
+ 87.90
+ ],
+ [
+ "Ireland",
+ 86.41
+ ],
+ [
+ "Slovakia",
+ 84.79
+ ],
+ [
+ "Moldova",
+ 81.11
+ ],
+ [
+ "Austria",
+ 80.03
+ ],
+ [
+ "Slovenia",
+ 78.52
+ ],
+ [
+ "Russian Federation",
+ 75.91
+ ],
+ [
+ "United Kingdom",
+ 72.36
+ ],
+ [
+ "Estonia",
+ 71.21
+ ],
+ [
+ "Belarus",
+ 70.84
+ ],
+ [
+ "Saudi Arabia",
+ 70.54
+ ],
+ [
+ "Former Czechoslovakia",
+ 67.49
+ ],
+ [
+ "Brazil",
+ 66.73
+ ],
+ [
+ "Italy",
+ 66.10
+ ],
+ [
+ "Serbia",
+ 64.52
+ ],
+ [
+ "Trinidad and Tobago",
+ 62.00
+ ],
+ [
+ "Bulgaria",
+ 60.83
+ ],
+ [
+ "Jordan",
+ 59.97
+ ],
+ [
+ "Ukraine",
+ 59.13
+ ],
+ [
+ "Vietnam",
+ 55.20
+ ],
+ [
+ "Australia",
+ 54.55
+ ],
+ [
+ "Uruguay",
+ 53.57
+ ],
+ [
+ "Grenada",
+ 48.84
+ ],
+ [
+ "Kosovo",
+ 48.68
+ ],
+ [
+ "Kazakhstan",
+ 47.43
+ ],
+ [
+ "Montenegro",
+ 47.17
+ ],
+ [
+ "Ghana",
+ 46.65
+ ],
+ [
+ "Argentina",
+ 44.28
+ ],
+ [
+ "Mongolia",
+ 43.62
+ ],
+ [
+ "Saint Vincent and the Grenadines",
+ 43.21
+ ],
+ [
+ "India",
+ 43.04
+ ],
+ [
+ "Kyrgyzstan",
+ 42.29
+ ],
+ [
+ "Mexico",
+ 42.27
+ ],
+ [
+ "Bahamas",
+ 41.69
+ ],
+ [
+ "Paraguay",
+ 39.99
+ ],
+ [
+ "Costa Rica",
+ 37.72
+ ],
+ [
+ "Belize",
+ 37.39
+ ],
+ [
+ "Saint Lucia",
+ 37.39
+ ],
+ [
+ "Croatia",
+ 37.20
+ ],
+ [
+ "Albania",
+ 37.11
+ ],
+ [
+ "Colombia",
+ 36.63
+ ],
+ [
+ "Oman",
+ 36.63
+ ],
+ [
+ "Jamaica",
+ 35.75
+ ],
+ [
+ "Peru",
+ 35.31
+ ],
+ [
+ "Seychelles",
+ 34.64
+ ],
+ [
+ "Bosnia and Herzegovina",
+ 34.43
+ ],
+ [
+ "South Africa",
+ 33.98
+ ],
+ [
+ "Madagascar",
+ 33.61
+ ],
+ [
+ "Tajikistan",
+ 32.61
+ ],
+ [
+ "Laos",
+ 31.53
+ ],
+ [
+ "Egypt",
+ 31.38
+ ],
+ [
+ "North Macedonia",
+ 31.26
+ ],
+ [
+ "Dominica",
+ 31.20
+ ],
+ [
+ "Cyprus",
+ 30.59
+ ],
+ [
+ "Armenia",
+ 30.49
+ ],
+ [
+ "Sri Lanka",
+ 30.35
+ ],
+ [
+ "Uzbekistan",
+ 29.80
+ ],
+ [
+ "Bangladesh",
+ 29.06
+ ],
+ [
+ "Greece",
+ 28.91
+ ],
+ [
+ "Turkey",
+ 27.95
+ ],
+ [
+ "Iraq",
+ 27.82
+ ],
+ [
+ "Georgia",
+ 26.91
+ ],
+ [
+ "Ecuador",
+ 26.83
+ ],
+ [
+ "Dominican Republic",
+ 25.99
+ ],
+ [
+ "Saint Kitts and Nevis",
+ 25.52
+ ],
+ [
+ "Philippines",
+ 25.34
+ ],
+ [
+ "Guyana",
+ 25.19
+ ],
+ [
+ "Cambodia",
+ 23.63
+ ],
+ [
+ "CI",
+ 22.84
+ ],
+ [
+ "Indonesia",
+ 22.53
+ ],
+ [
+ "Azerbaijan",
+ 22.29
+ ],
+ [
+ "Rwanda",
+ 22.00
+ ],
+ [
+ "Maldives",
+ 21.95
+ ],
+ [
+ "Nepal",
+ 21.91
+ ],
+ [
+ "Senegal",
+ 21.27
+ ],
+ [
+ "Gabon",
+ 20.88
+ ],
+ [
+ "Myanmar",
+ 20.87
+ ],
+ [
+ "Cape Verde",
+ 20.85
+ ],
+ [
+ "Iran",
+ 20.58
+ ],
+ [
+ "Western Sahara",
+ 20.12
+ ],
+ [
+ "Togo",
+ 19.91
+ ],
+ [
+ "Mauritius",
+ 19.80
+ ],
+ [
+ "Fiji Islands",
+ 19.47
+ ],
+ [
+ "Morocco",
+ 19.01
+ ],
+ [
+ "Bolivia",
+ 18.47
+ ],
+ [
+ "Liberia",
+ 18.26
+ ],
+ [
+ "Mali",
+ 17.99
+ ],
+ [
+ "Somalia",
+ 17.88
+ ],
+ [
+ "Honduras",
+ 17.71
+ ],
+ [
+ "Nicaragua",
+ 17.36
+ ],
+ [
+ "Antigua and Barbuda",
+ 16.85
+ ],
+ [
+ "Congo",
+ 16.20
+ ],
+ [
+ "El Salvador",
+ 16.18
+ ],
+ [
+ "Bhutan",
+ 16.06
+ ],
+ [
+ "Palestine",
+ 15.52
+ ],
+ [
+ "Kenya",
+ 15.23
+ ],
+ [
+ "Tanzania",
+ 14.96
+ ],
+ [
+ "Guatemala",
+ 14.96
+ ],
+ [
+ "Angola",
+ 14.77
+ ],
+ [
+ "Zimbabwe",
+ 14.74
+ ],
+ [
+ "Namibia",
+ 14.63
+ ],
+ [
+ "Zambia",
+ 14.14
+ ],
+ [
+ "Guinea",
+ 13.88
+ ],
+ [
+ "Djibouti",
+ 13.48
+ ],
+ [
+ "Swaziland",
+ 13.25
+ ],
+ [
+ "Haiti",
+ 13.09
+ ],
+ [
+ "Papua New Guinea",
+ 13.08
+ ],
+ [
+ "Nigeria",
+ 12.61
+ ],
+ [
+ "Uganda",
+ 12.11
+ ],
+ [
+ "Sierra Leone",
+ 11.69
+ ],
+ [
+ "Suriname",
+ 11.39
+ ],
+ [
+ "Malawi",
+ 11.16
+ ],
+ [
+ "Burkina Faso",
+ 11.05
+ ],
+ [
+ "Libyan Arab Jamahiriya",
+ 10.91
+ ],
+ [
+ "Cameroon",
+ 10.27
+ ],
+ [
+ "Benin",
+ 10.24
+ ],
+ [
+ "Lebanon",
+ 10.24
+ ],
+ [
+ "The Democratic Republic of Congo",
+ 9.82
+ ],
+ [
+ "Pakistan",
+ 9.56
+ ],
+ [
+ "Tunisia",
+ 9.52
+ ],
+ [
+ "Botswana",
+ 8.81
+ ],
+ [
+ "Ethiopia",
+ 8.72
+ ],
+ [
+ "Mozambique",
+ 8.61
+ ],
+ [
+ "Syria",
+ 8.25
+ ],
+ [
+ "Afghanistan",
+ 8.20
+ ],
+ [
+ "Burundi",
+ 7.89
+ ],
+ [
+ "Gambia",
+ 7.79
+ ],
+ [
+ "Sudan",
+ 6.26
+ ],
+ [
+ "Venezuela",
+ 6.15
+ ],
+ [
+ "Mauritania",
+ 5.50
+ ],
+ [
+ "Cuba",
+ 5.09
+ ],
+ [
+ "Yemen",
+ 4.35
+ ],
+ [
+ "Algeria",
+ 3.92
+ ],
+ [
+ "Turkmenistan",
+ 3.56
+ ]
+]
\ No newline at end of file
diff --git a/test/testdata/deployednettemplates/recipes/mainnet-model/data/countries.json b/test/testdata/deployednettemplates/recipes/mainnet-model/data/countries.json
new file mode 100644
index 0000000000..4e9ab04181
--- /dev/null
+++ b/test/testdata/deployednettemplates/recipes/mainnet-model/data/countries.json
@@ -0,0 +1,1026 @@
+[
+ {
+ "country": "Afghanistan",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Albania",
+ "continent": "Europe"
+ },
+ {
+ "country": "Algeria",
+ "continent": "Africa"
+ },
+ {
+ "country": "American Samoa",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Andorra",
+ "continent": "Europe"
+ },
+ {
+ "country": "Angola",
+ "continent": "Africa"
+ },
+ {
+ "country": "Anguilla",
+ "continent": "North America"
+ },
+ {
+ "country": "Antarctica",
+ "continent": "Antarctica"
+ },
+ {
+ "country": "Antigua and Barbuda",
+ "continent": "North America"
+ },
+ {
+ "country": "Argentina",
+ "continent": "South America"
+ },
+ {
+ "country": "Armenia",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Aruba",
+ "continent": "North America"
+ },
+ {
+ "country": "Australia",
+ "continent": "Australia"
+ },
+ {
+ "country": "Austria",
+ "continent": "Europe"
+ },
+ {
+ "country": "Azerbaijan",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Bahamas",
+ "continent": "North America"
+ },
+ {
+ "country": "Bahrain",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Bangladesh",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Barbados",
+ "continent": "North America"
+ },
+ {
+ "country": "Belarus",
+ "continent": "Europe"
+ },
+ {
+ "country": "Belgium",
+ "continent": "Europe"
+ },
+ {
+ "country": "Belize",
+ "continent": "North America"
+ },
+ {
+ "country": "Benin",
+ "continent": "Africa"
+ },
+ {
+ "country": "Bermuda",
+ "continent": "North America"
+ },
+ {
+ "country": "Bhutan",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Bolivia",
+ "continent": "South America"
+ },
+ {
+ "country": "Bosnia and Herzegovina",
+ "continent": "Europe"
+ },
+ {
+ "country": "Botswana",
+ "continent": "Africa"
+ },
+ {
+ "country": "Bouvet Island",
+ "continent": "Antarctica"
+ },
+ {
+ "country": "Brazil",
+ "continent": "South America"
+ },
+ {
+ "country": "British Indian Ocean Territory",
+ "continent": "Africa"
+ },
+ {
+ "country": "Brunei",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Bulgaria",
+ "continent": "Europe"
+ },
+ {
+ "country": "Burkina Faso",
+ "continent": "Africa"
+ },
+ {
+ "country": "Burundi",
+ "continent": "Africa"
+ },
+ {
+ "country": "Cambodia",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Cameroon",
+ "continent": "Africa"
+ },
+ {
+ "country": "Canada",
+ "continent": "North America"
+ },
+ {
+ "country": "Cape Verde",
+ "continent": "Africa"
+ },
+ {
+ "country": "Cayman Islands",
+ "continent": "North America"
+ },
+ {
+ "country": "Central African Republic",
+ "continent": "Africa"
+ },
+ {
+ "country": "Chad",
+ "continent": "Africa"
+ },
+ {
+ "country": "Chile",
+ "continent": "South America"
+ },
+ {
+ "country": "China",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Christmas Island",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Cocos (Keeling) Islands",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Colombia",
+ "continent": "South America"
+ },
+ {
+ "country": "Comoros",
+ "continent": "Africa"
+ },
+ {
+ "country": "Congo",
+ "continent": "Africa"
+ },
+ {
+ "country": "Cook Islands",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Costa Rica",
+ "continent": "North America"
+ },
+ {
+ "country": "Croatia",
+ "continent": "Europe"
+ },
+ {
+ "country": "Cuba",
+ "continent": "North America"
+ },
+ {
+ "country": "Cyprus",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Czech Republic",
+ "continent": "Europe"
+ },
+ {
+ "country": "Denmark",
+ "continent": "Europe"
+ },
+ {
+ "country": "Djibouti",
+ "continent": "Africa"
+ },
+ {
+ "country": "Dominica",
+ "continent": "North America"
+ },
+ {
+ "country": "Dominican Republic",
+ "continent": "North America"
+ },
+ {
+ "country": "East Timor",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Ecuador",
+ "continent": "South America"
+ },
+ {
+ "country": "Egypt",
+ "continent": "Africa"
+ },
+ {
+ "country": "El Salvador",
+ "continent": "North America"
+ },
+ {
+ "country": "England",
+ "continent": "Europe"
+ },
+ {
+ "country": "Equatorial Guinea",
+ "continent": "Africa"
+ },
+ {
+ "country": "Eritrea",
+ "continent": "Africa"
+ },
+ {
+ "country": "Estonia",
+ "continent": "Europe"
+ },
+ {
+ "country": "Ethiopia",
+ "continent": "Africa"
+ },
+ {
+ "country": "Falkland Islands",
+ "continent": "South America"
+ },
+ {
+ "country": "Faroe Islands",
+ "continent": "Europe"
+ },
+ {
+ "country": "Fiji Islands",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Finland",
+ "continent": "Europe"
+ },
+ {
+ "country": "France",
+ "continent": "Europe"
+ },
+ {
+ "country": "French Guiana",
+ "continent": "South America"
+ },
+ {
+ "country": "French Polynesia",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "French Southern territories",
+ "continent": "Antarctica"
+ },
+ {
+ "country": "Gabon",
+ "continent": "Africa"
+ },
+ {
+ "country": "Gambia",
+ "continent": "Africa"
+ },
+ {
+ "country": "Georgia",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Germany",
+ "continent": "Europe"
+ },
+ {
+ "country": "Ghana",
+ "continent": "Africa"
+ },
+ {
+ "country": "Gibraltar",
+ "continent": "Europe"
+ },
+ {
+ "country": "Greece",
+ "continent": "Europe"
+ },
+ {
+ "country": "Greenland",
+ "continent": "North America"
+ },
+ {
+ "country": "Grenada",
+ "continent": "North America"
+ },
+ {
+ "country": "Guadeloupe",
+ "continent": "North America"
+ },
+ {
+ "country": "Guam",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Guatemala",
+ "continent": "North America"
+ },
+ {
+ "country": "Guinea",
+ "continent": "Africa"
+ },
+ {
+ "country": "Guinea-Bissau",
+ "continent": "Africa"
+ },
+ {
+ "country": "Guyana",
+ "continent": "South America"
+ },
+ {
+ "country": "Haiti",
+ "continent": "North America"
+ },
+ {
+ "country": "Heard Island and McDonald Islands",
+ "continent": "Antarctica"
+ },
+ {
+ "country": "Holy See (Vatican City State)",
+ "continent": "Europe"
+ },
+ {
+ "country": "Honduras",
+ "continent": "North America"
+ },
+ {
+ "country": "Hong Kong",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Hungary",
+ "continent": "Europe"
+ },
+ {
+ "country": "Iceland",
+ "continent": "Europe"
+ },
+ {
+ "country": "India",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Indonesia",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Iran",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Iraq",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Ireland",
+ "continent": "Europe"
+ },
+ {
+ "country": "Israel",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Italy",
+ "continent": "Europe"
+ },
+ {
+ "country": "Ivory Coast",
+ "continent": "Africa"
+ },
+ {
+ "country": "Jamaica",
+ "continent": "North America"
+ },
+ {
+ "country": "Japan",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Jordan",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Kazakhstan",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Kenya",
+ "continent": "Africa"
+ },
+ {
+ "country": "Kiribati",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Kuwait",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Kyrgyzstan",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Laos",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Latvia",
+ "continent": "Europe"
+ },
+ {
+ "country": "Lebanon",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Lesotho",
+ "continent": "Africa"
+ },
+ {
+ "country": "Liberia",
+ "continent": "Africa"
+ },
+ {
+ "country": "Libyan Arab Jamahiriya",
+ "continent": "Africa"
+ },
+ {
+ "country": "Liechtenstein",
+ "continent": "Europe"
+ },
+ {
+ "country": "Lithuania",
+ "continent": "Europe"
+ },
+ {
+ "country": "Luxembourg",
+ "continent": "Europe"
+ },
+ {
+ "country": "Macao",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "North Macedonia",
+ "continent": "Europe"
+ },
+ {
+ "country": "Madagascar",
+ "continent": "Africa"
+ },
+ {
+ "country": "Malawi",
+ "continent": "Africa"
+ },
+ {
+ "country": "Malaysia",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Maldives",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Mali",
+ "continent": "Africa"
+ },
+ {
+ "country": "Malta",
+ "continent": "Europe"
+ },
+ {
+ "country": "Marshall Islands",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Martinique",
+ "continent": "North America"
+ },
+ {
+ "country": "Mauritania",
+ "continent": "Africa"
+ },
+ {
+ "country": "Mauritius",
+ "continent": "Africa"
+ },
+ {
+ "country": "Mayotte",
+ "continent": "Africa"
+ },
+ {
+ "country": "Mexico",
+ "continent": "North America"
+ },
+ {
+ "country": "Micronesia, Federated States of",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Moldova",
+ "continent": "Europe"
+ },
+ {
+ "country": "Monaco",
+ "continent": "Europe"
+ },
+ {
+ "country": "Mongolia",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Montenegro",
+ "continent": "Europe"
+ },
+ {
+ "country": "Montserrat",
+ "continent": "North America"
+ },
+ {
+ "country": "Morocco",
+ "continent": "Africa"
+ },
+ {
+ "country": "Mozambique",
+ "continent": "Africa"
+ },
+ {
+ "country": "Myanmar",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Namibia",
+ "continent": "Africa"
+ },
+ {
+ "country": "Nauru",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Nepal",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Netherlands",
+ "continent": "Europe"
+ },
+ {
+ "country": "Netherlands Antilles",
+ "continent": "North America"
+ },
+ {
+ "country": "New Caledonia",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "New Zealand",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Nicaragua",
+ "continent": "North America"
+ },
+ {
+ "country": "Niger",
+ "continent": "Africa"
+ },
+ {
+ "country": "Nigeria",
+ "continent": "Africa"
+ },
+ {
+ "country": "Niue",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Norfolk Island",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "North Korea",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Northern Ireland",
+ "continent": "Europe"
+ },
+ {
+ "country": "Northern Mariana Islands",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Norway",
+ "continent": "Europe"
+ },
+ {
+ "country": "Oman",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Pakistan",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Palau",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Palestine",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Panama",
+ "continent": "North America"
+ },
+ {
+ "country": "Papua New Guinea",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Paraguay",
+ "continent": "South America"
+ },
+ {
+ "country": "Peru",
+ "continent": "South America"
+ },
+ {
+ "country": "Philippines",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Pitcairn",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Poland",
+ "continent": "Europe"
+ },
+ {
+ "country": "Portugal",
+ "continent": "Europe"
+ },
+ {
+ "country": "Puerto Rico",
+ "continent": "North America"
+ },
+ {
+ "country": "Qatar",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Reunion",
+ "continent": "Africa"
+ },
+ {
+ "country": "Romania",
+ "continent": "Europe"
+ },
+ {
+ "country": "Russian Federation",
+ "continent": "Europe"
+ },
+ {
+ "country": "Former USSR",
+ "continent": "Europe"
+ },
+ {
+ "country": "Azerbaidjan",
+ "continent": "Europe"
+ },
+ {
+ "country": "Macau",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Svalbard and Jan Mayen Islands",
+ "continent": "Europe"
+ },
+ {
+ "country": "Saint Tome (Sao Tome) and Principe",
+ "continent": "Africa"
+ },
+ {
+ "country": "Serbia",
+ "continent": "Europe"
+ },
+ {
+ "country": "Moldavia",
+ "continent": "Europe"
+ },
+ {
+ "country": "CI",
+ "continent": "Africa"
+ },
+ {
+ "country": "Rwanda",
+ "continent": "Africa"
+ },
+ {
+ "country": "Saint Helena",
+ "continent": "Africa"
+ },
+ {
+ "country": "Saint Kitts and Nevis",
+ "continent": "North America"
+ },
+ {
+ "country": "Saint Lucia",
+ "continent": "North America"
+ },
+ {
+ "country": "Saint Pierre and Miquelon",
+ "continent": "North America"
+ },
+ {
+ "country": "Saint Vincent and the Grenadines",
+ "continent": "North America"
+ },
+ {
+ "country": "Samoa",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "San Marino",
+ "continent": "Europe"
+ },
+ {
+ "country": "Sao Tome and Principe",
+ "continent": "Africa"
+ },
+ {
+ "country": "Saudi Arabia",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Scotland",
+ "continent": "Europe"
+ },
+ {
+ "country": "Senegal",
+ "continent": "Africa"
+ },
+ {
+ "country": "Seychelles",
+ "continent": "Africa"
+ },
+ {
+ "country": "Sierra Leone",
+ "continent": "Africa"
+ },
+ {
+ "country": "Singapore",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Former Czechoslovakia",
+ "continent": "Europe"
+ },
+ {
+ "country": "Slovakia",
+ "continent": "Europe"
+ },
+ {
+ "country": "Taiwan",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Kosovo",
+ "continent": "Europe"
+ },
+ {
+ "country": "Tadjikistan",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Slovenia",
+ "continent": "Europe"
+ },
+ {
+ "country": "Solomon Islands",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Somalia",
+ "continent": "Africa"
+ },
+ {
+ "country": "South Africa",
+ "continent": "Africa"
+ },
+ {
+ "country": "South Georgia and the South Sandwich Islands",
+ "continent": "Antarctica"
+ },
+ {
+ "country": "South Korea",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "South Sudan",
+ "continent": "Africa"
+ },
+ {
+ "country": "Spain",
+ "continent": "Europe"
+ },
+ {
+ "country": "Sri Lanka",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Sudan",
+ "continent": "Africa"
+ },
+ {
+ "country": "Suriname",
+ "continent": "South America"
+ },
+ {
+ "country": "Svalbard and Jan Mayen",
+ "continent": "Europe"
+ },
+ {
+ "country": "Swaziland",
+ "continent": "Africa"
+ },
+ {
+ "country": "Sweden",
+ "continent": "Europe"
+ },
+ {
+ "country": "Switzerland",
+ "continent": "Europe"
+ },
+ {
+ "country": "Syria",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Tajikistan",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Tanzania",
+ "continent": "Africa"
+ },
+ {
+ "country": "Thailand",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "The Democratic Republic of Congo",
+ "continent": "Africa"
+ },
+ {
+ "country": "Togo",
+ "continent": "Africa"
+ },
+ {
+ "country": "Tokelau",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Tonga",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Trinidad and Tobago",
+ "continent": "North America"
+ },
+ {
+ "country": "Tunisia",
+ "continent": "Africa"
+ },
+ {
+ "country": "Turkey",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Turkmenistan",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Turks and Caicos Islands",
+ "continent": "North America"
+ },
+ {
+ "country": "Tuvalu",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Uganda",
+ "continent": "Africa"
+ },
+ {
+ "country": "Ukraine",
+ "continent": "Europe"
+ },
+ {
+ "country": "United Arab Emirates",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "United Kingdom",
+ "continent": "Europe"
+ },
+ {
+ "country": "United States",
+ "continent": "North America"
+ },
+ {
+ "country": "United States Minor Outlying Islands",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Uruguay",
+ "continent": "South America"
+ },
+ {
+ "country": "Uzbekistan",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Vanuatu",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Venezuela",
+ "continent": "South America"
+ },
+ {
+ "country": "Vietnam",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Virgin Islands, British",
+ "continent": "North America"
+ },
+ {
+ "country": "Virgin Islands, U.S.",
+ "continent": "North America"
+ },
+ {
+ "country": "Wales",
+ "continent": "Europe"
+ },
+ {
+ "country": "Wallis and Futuna",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Western Sahara",
+ "continent": "Africa"
+ },
+ {
+ "country": "Yemen",
+ "continent": "Asia Pacific"
+ },
+ {
+ "country": "Yugoslavia",
+ "continent": "Europe"
+ },
+ {
+ "country": "Zambia",
+ "continent": "Africa"
+ },
+ {
+ "country": "Zimbabwe",
+ "continent": "Africa"
+ }
+]
\ No newline at end of file
diff --git a/test/testdata/deployednettemplates/recipes/mainnet-model/data/latency.json b/test/testdata/deployednettemplates/recipes/mainnet-model/data/latency.json
new file mode 100644
index 0000000000..ae3f59ea9e
--- /dev/null
+++ b/test/testdata/deployednettemplates/recipes/mainnet-model/data/latency.json
@@ -0,0 +1,127 @@
+[
+ {
+ "source": "Europe",
+ "target": "Europe",
+ "latency": 16
+ },
+ {
+ "source": "Europe",
+ "target": "North America",
+ "latency": 39.7
+ },
+ {
+ "source": "Europe",
+ "target": "Australia",
+ "latency": 135
+ },
+ {
+ "source": "Europe",
+ "target": "Africa",
+ "latency": 84.5
+ },
+ {
+ "source": "Europe",
+ "target": "Asia Pacific",
+ "latency": 75.3
+ },
+ {
+ "source": "North America",
+ "target": "Europe",
+ "latency": 39.7
+ },
+ {
+ "source": "North America",
+ "target": "North America",
+ "latency": 22
+ },
+ {
+ "source": "North America",
+ "target": "Australia",
+ "latency": 101.5
+ },
+ {
+ "source": "North America",
+ "target": "Africa",
+ "latency": 124
+ },
+ {
+ "source": "North America",
+ "target": "Asia Pacific",
+ "latency": 120
+ },
+ {
+ "source": "Australia",
+ "target": "Europe",
+ "latency": 135.5
+ },
+ {
+ "source": "Australia",
+ "target": "North America",
+ "latency": 101.5
+ },
+ {
+ "source": "Australia",
+ "target": "Australia",
+ "latency": 23
+ },
+ {
+ "source": "Australia",
+ "target": "Africa",
+ "latency": 216.5
+ },
+ {
+ "source": "Australia",
+ "target": "Asia Pacific",
+ "latency": 47
+ },
+ {
+ "source": "Africa",
+ "target": "Europe",
+ "latency": 84.5
+ },
+ {
+ "source": "Africa",
+ "target": "North America",
+ "latency": 118
+ },
+ {
+ "source": "Africa",
+ "target": "Australia",
+ "latency": 216
+ },
+ {
+ "source": "Africa",
+ "target": "Africa",
+ "latency": 70
+ },
+ {
+ "source": "Africa",
+ "target": "Asia Pacific",
+ "latency": 202
+ },
+ {
+ "source": "Asia Pacific",
+ "target": "Europe",
+ "latency": 75
+ },
+ {
+ "source": "Asia Pacific",
+ "target": "North America",
+ "latency": 120
+ },
+ {
+ "source": "Asia Pacific",
+ "target": "Australia",
+ "latency": 47
+ },
+ {
+ "source": "Asia Pacific",
+ "target": "Africa",
+ "latency": 202
+ },
+ {
+ "source": "Asia Pacific",
+ "target": "Asia Pacific",
+ "latency": 32
+ }
+]
diff --git a/test/testdata/deployednettemplates/recipes/mainnet-model/generate_network_rules.js b/test/testdata/deployednettemplates/recipes/mainnet-model/generate_network_rules.js
new file mode 100644
index 0000000000..8b8fc4bdf3
--- /dev/null
+++ b/test/testdata/deployednettemplates/recipes/mainnet-model/generate_network_rules.js
@@ -0,0 +1,80 @@
+const fs = require('fs');
+
+const RELAY_BANDWIDTH = 1000
+const SAME_REGION_RELAY_TO_RELAY_LATENCY = 10
+const CROSS_REGION_NODE_BANDWIDTH_FACTOR = 0.8
+
+const countries = JSON.parse(fs.readFileSync('./data/countries.json'))
+const countryBandwidths = JSON.parse(fs.readFileSync('./data/bandwidth.json'))
+const latencies = JSON.parse(fs.readFileSync('./data/latency.json'))
+
+const continentToGroup = {
+ "North America": "us",
+ "Europe": "eu",
+ "Asia Pacific": "ap",
+ "Africa": "af",
+ "Australia": "au",
+}
+
+var latencyMap = []
+var countryToContinent = []
+var continentBandwidths = []
+
+latencies.forEach((latency) => {
+ if (!latencyMap[latency.source]) {
+ latencyMap[latency.source] = []
+ }
+ latencyMap[latency.source][latency.target] = latency.latency
+})
+
+countries.forEach((country) => {
+ countryToContinent[country.country] = country.continent
+})
+
+countryBandwidths.forEach((countryBandwidth) => {
+ const continent = countryToContinent[countryBandwidth[0]]
+ if (!continent) {
+ console.log(countryBandwidth)
+ }
+ if(Object.keys(continentBandwidths).indexOf(continent) == -1) {
+ continentBandwidths[continent] = {
+ bandwidths: []
+ }
+
+ }
+ continentBandwidths[continent].bandwidths.push(countryBandwidth[1])
+})
+
+const average = (data) => {
+ var sum = data.reduce(function(sum, value){
+ return sum + value;
+ }, 0);
+ return sum / data.length
+}
+
+var writer = fs.createWriteStream('./network_performance_rules', {
+ flags: 'w'
+})
+
+Object.keys(continentToGroup).forEach((source) => {
+ Object.keys(continentToGroup).forEach((target) => {
+ sourceGroup = continentToGroup[source]
+ targetGroup = continentToGroup[target]
+ const bandwidth = average(continentBandwidths[source]['bandwidths'])
+ const latency = latencyMap[source][target]
+ var relay_to_relay_latency
+ var node_bandwidth_factor
+ if (sourceGroup==targetGroup) {
+ relay_to_relay_latency = SAME_REGION_RELAY_TO_RELAY_LATENCY
+ node_bandwidth_factor = 1.0
+ } else {
+ relay_to_relay_latency = latency
+ node_bandwidth_factor = CROSS_REGION_NODE_BANDWIDTH_FACTOR
+ }
+ writer.write(`${sourceGroup}-n ${targetGroup}-r ${Math.round(bandwidth*node_bandwidth_factor)} ${Math.round(latency)}\n`)
+ writer.write(`${sourceGroup}-r ${targetGroup}-n ${RELAY_BANDWIDTH} ${Math.round(latency)}\n`)
+ writer.write(`${sourceGroup}-r ${targetGroup}-r ${RELAY_BANDWIDTH} ${Math.round(relay_to_relay_latency)}\n`)
+ })
+})
+
+writer.end()
diff --git a/test/testdata/deployednettemplates/recipes/mainnet-model/generated/genesis.json b/test/testdata/deployednettemplates/recipes/mainnet-model/generated/genesis.json
new file mode 100644
index 0000000000..c1f7c184e9
--- /dev/null
+++ b/test/testdata/deployednettemplates/recipes/mainnet-model/generated/genesis.json
@@ -0,0 +1,1013 @@
+{
+ "NetworkName": "",
+ "VersionModifier": "",
+ "ConsensusProtocol": "",
+ "FirstPartKeyRound": 0,
+ "LastPartKeyRound": 3000000,
+ "PartKeyDilution": 0,
+ "Wallets": [
+ {
+ "Name": "Wallet1",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet2",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet3",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet4",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet5",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet6",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet7",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet8",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet9",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet10",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet11",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet12",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet13",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet14",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet15",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet16",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet17",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet18",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet19",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet20",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet21",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet22",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet23",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet24",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet25",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet26",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet27",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet28",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet29",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet30",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet31",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet32",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet33",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet34",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet35",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet36",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet37",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet38",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet39",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet40",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet41",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet42",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet43",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet44",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet45",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet46",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet47",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet48",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet49",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet50",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet51",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet52",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet53",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet54",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet55",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet56",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet57",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet58",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet59",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet60",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet61",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet62",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet63",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet64",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet65",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet66",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet67",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet68",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet69",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet70",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet71",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet72",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet73",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet74",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet75",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet76",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet77",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet78",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet79",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet80",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet81",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet82",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet83",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet84",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet85",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet86",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet87",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet88",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet89",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet90",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet91",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet92",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet93",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet94",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet95",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet96",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet97",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet98",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet99",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet100",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet101",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet102",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet103",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet104",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet105",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet106",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet107",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet108",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet109",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet110",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet111",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet112",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet113",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet114",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet115",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet116",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet117",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet118",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet119",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet120",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet121",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet122",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet123",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet124",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet125",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet126",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet127",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet128",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet129",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet130",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet131",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet132",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet133",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet134",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet135",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet136",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet137",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet138",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet139",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet140",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet141",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet142",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet143",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet144",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet145",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet146",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet147",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet148",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet149",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet150",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet151",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet152",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet153",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet154",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet155",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet156",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet157",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet158",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet159",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet160",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet161",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet162",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet163",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet164",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet165",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet166",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet167",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet168",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet169",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet170",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet171",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet172",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet173",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet174",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet175",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet176",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet177",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet178",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet179",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet180",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet181",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet182",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet183",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet184",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet185",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet186",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet187",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet188",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet189",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet190",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet191",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet192",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet193",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet194",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet195",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet196",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet197",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet198",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet199",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet200",
+ "Stake": 0.5,
+ "Online": false
+ }
+ ],
+ "FeeSink": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ",
+ "RewardsPool": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ",
+ "Comment": ""
+}
diff --git a/test/testdata/deployednettemplates/recipes/mainnet-model/generated/net.json b/test/testdata/deployednettemplates/recipes/mainnet-model/generated/net.json
new file mode 100644
index 0000000000..45e48856b5
--- /dev/null
+++ b/test/testdata/deployednettemplates/recipes/mainnet-model/generated/net.json
@@ -0,0 +1,1959 @@
+{
+ "Hosts": [
+ {
+ "Name": "R1",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay1",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R2",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay2",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R3",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay3",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R4",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay4",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R5",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay5",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R6",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay6",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R7",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay7",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R8",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay8",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R9",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay9",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R10",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay10",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R11",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay11",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R12",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay12",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R13",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay13",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R14",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay14",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R15",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay15",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R16",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay16",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R17",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay17",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R18",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay18",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R19",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay19",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R20",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay20",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R21",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay21",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R22",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay22",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R23",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay23",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R24",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay24",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R25",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay25",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N1",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node1",
+ "Wallets": [
+ {
+ "Name": "Wallet1",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet26",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet51",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet76",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N2",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node2",
+ "Wallets": [
+ {
+ "Name": "Wallet2",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet27",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet52",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet77",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N3",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node3",
+ "Wallets": [
+ {
+ "Name": "Wallet3",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet28",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet53",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet78",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N4",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node4",
+ "Wallets": [
+ {
+ "Name": "Wallet4",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet29",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet54",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet79",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N5",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node5",
+ "Wallets": [
+ {
+ "Name": "Wallet5",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet30",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet55",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet80",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N6",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node6",
+ "Wallets": [
+ {
+ "Name": "Wallet6",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet31",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet56",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet81",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N7",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node7",
+ "Wallets": [
+ {
+ "Name": "Wallet7",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet32",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet57",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet82",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N8",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node8",
+ "Wallets": [
+ {
+ "Name": "Wallet8",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet33",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet58",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet83",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N9",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node9",
+ "Wallets": [
+ {
+ "Name": "Wallet9",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet34",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet59",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet84",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N10",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node10",
+ "Wallets": [
+ {
+ "Name": "Wallet10",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet35",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet60",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet85",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N11",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node11",
+ "Wallets": [
+ {
+ "Name": "Wallet11",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet36",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet61",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet86",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N12",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node12",
+ "Wallets": [
+ {
+ "Name": "Wallet12",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet37",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet62",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet87",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N13",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node13",
+ "Wallets": [
+ {
+ "Name": "Wallet13",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet38",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet63",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet88",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N14",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node14",
+ "Wallets": [
+ {
+ "Name": "Wallet14",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet39",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet64",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet89",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N15",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node15",
+ "Wallets": [
+ {
+ "Name": "Wallet15",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet40",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet65",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet90",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N16",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node16",
+ "Wallets": [
+ {
+ "Name": "Wallet16",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet41",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet66",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet91",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N17",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node17",
+ "Wallets": [
+ {
+ "Name": "Wallet17",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet42",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet67",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet92",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N18",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node18",
+ "Wallets": [
+ {
+ "Name": "Wallet18",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet43",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet68",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet93",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N19",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node19",
+ "Wallets": [
+ {
+ "Name": "Wallet19",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet44",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet69",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet94",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N20",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node20",
+ "Wallets": [
+ {
+ "Name": "Wallet20",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet45",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet70",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet95",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N21",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node21",
+ "Wallets": [
+ {
+ "Name": "Wallet21",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet46",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet71",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet96",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N22",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node22",
+ "Wallets": [
+ {
+ "Name": "Wallet22",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet47",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet72",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet97",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N23",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node23",
+ "Wallets": [
+ {
+ "Name": "Wallet23",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet48",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet73",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet98",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N24",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node24",
+ "Wallets": [
+ {
+ "Name": "Wallet24",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet49",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet74",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet99",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N25",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node25",
+ "Wallets": [
+ {
+ "Name": "Wallet25",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet50",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet75",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet100",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "NPN1",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "nonParticipatingNode1",
+ "Wallets": [
+ {
+ "Name": "Wallet101",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet111",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet121",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet131",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet141",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet151",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet161",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet171",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet181",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet191",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "EnableMetrics": false,
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"BaseLoggerDebugLevel\": 4 }"
+ }
+ ]
+ },
+ {
+ "Name": "NPN2",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "nonParticipatingNode2",
+ "Wallets": [
+ {
+ "Name": "Wallet102",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet112",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet122",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet132",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet142",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet152",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet162",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet172",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet182",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet192",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "EnableMetrics": false,
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"BaseLoggerDebugLevel\": 4 }"
+ }
+ ]
+ },
+ {
+ "Name": "NPN3",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "nonParticipatingNode3",
+ "Wallets": [
+ {
+ "Name": "Wallet103",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet113",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet123",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet133",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet143",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet153",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet163",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet173",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet183",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet193",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "EnableMetrics": false,
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"BaseLoggerDebugLevel\": 4 }"
+ }
+ ]
+ },
+ {
+ "Name": "NPN4",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "nonParticipatingNode4",
+ "Wallets": [
+ {
+ "Name": "Wallet104",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet114",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet124",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet134",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet144",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet154",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet164",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet174",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet184",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet194",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "EnableMetrics": false,
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"BaseLoggerDebugLevel\": 4 }"
+ }
+ ]
+ },
+ {
+ "Name": "NPN5",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "nonParticipatingNode5",
+ "Wallets": [
+ {
+ "Name": "Wallet105",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet115",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet125",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet135",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet145",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet155",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet165",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet175",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet185",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet195",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "EnableMetrics": false,
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"BaseLoggerDebugLevel\": 4 }"
+ }
+ ]
+ },
+ {
+ "Name": "NPN6",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "nonParticipatingNode6",
+ "Wallets": [
+ {
+ "Name": "Wallet106",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet116",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet126",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet136",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet146",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet156",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet166",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet176",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet186",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet196",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "EnableMetrics": false,
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"BaseLoggerDebugLevel\": 4 }"
+ }
+ ]
+ },
+ {
+ "Name": "NPN7",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "nonParticipatingNode7",
+ "Wallets": [
+ {
+ "Name": "Wallet107",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet117",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet127",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet137",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet147",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet157",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet167",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet177",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet187",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet197",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "EnableMetrics": false,
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"BaseLoggerDebugLevel\": 4 }"
+ }
+ ]
+ },
+ {
+ "Name": "NPN8",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "nonParticipatingNode8",
+ "Wallets": [
+ {
+ "Name": "Wallet108",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet118",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet128",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet138",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet148",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet158",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet168",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet178",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet188",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet198",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "EnableMetrics": false,
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"BaseLoggerDebugLevel\": 4 }"
+ }
+ ]
+ },
+ {
+ "Name": "NPN9",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "nonParticipatingNode9",
+ "Wallets": [
+ {
+ "Name": "Wallet109",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet119",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet129",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet139",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet149",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet159",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet169",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet179",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet189",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet199",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "EnableMetrics": false,
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"BaseLoggerDebugLevel\": 4 }"
+ }
+ ]
+ },
+ {
+ "Name": "NPN10",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "nonParticipatingNode10",
+ "Wallets": [
+ {
+ "Name": "Wallet110",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet120",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet130",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet140",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet150",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet160",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet170",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet180",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet190",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet200",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "EnableMetrics": false,
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"BaseLoggerDebugLevel\": 4 }"
+ }
+ ]
+ }
+ ]
+}
diff --git a/test/testdata/deployednettemplates/recipes/mainnet-model/generated/topology.json b/test/testdata/deployednettemplates/recipes/mainnet-model/generated/topology.json
new file mode 100644
index 0000000000..db766f1233
--- /dev/null
+++ b/test/testdata/deployednettemplates/recipes/mainnet-model/generated/topology.json
@@ -0,0 +1,304 @@
+{
+ "Hosts": [
+ {
+ "Name": "R1",
+ "Group": "us-r",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "R2",
+ "Group": "us-r",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "R3",
+ "Group": "us-r",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "R4",
+ "Group": "us-r",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "R5",
+ "Group": "us-r",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "R6",
+ "Group": "eu-r",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "R7",
+ "Group": "eu-r",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "R8",
+ "Group": "eu-r",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "R9",
+ "Group": "eu-r",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "R10",
+ "Group": "eu-r",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "R11",
+ "Group": "ap-r",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "R12",
+ "Group": "ap-r",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "R13",
+ "Group": "ap-r",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "R14",
+ "Group": "ap-r",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "R15",
+ "Group": "ap-r",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "R16",
+ "Group": "af-r",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "R17",
+ "Group": "af-r",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "R18",
+ "Group": "af-r",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "R19",
+ "Group": "af-r",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "R20",
+ "Group": "af-r",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "R21",
+ "Group": "au-r",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "R22",
+ "Group": "au-r",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "R23",
+ "Group": "au-r",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "R24",
+ "Group": "au-r",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "R25",
+ "Group": "au-r",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "N1",
+ "Group": "us-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "N2",
+ "Group": "us-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "N3",
+ "Group": "us-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "N4",
+ "Group": "us-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "N5",
+ "Group": "us-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "N6",
+ "Group": "eu-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "N7",
+ "Group": "eu-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "N8",
+ "Group": "eu-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "N9",
+ "Group": "eu-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "N10",
+ "Group": "eu-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "N11",
+ "Group": "ap-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "N12",
+ "Group": "ap-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "N13",
+ "Group": "ap-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "N14",
+ "Group": "ap-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "N15",
+ "Group": "ap-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "N16",
+ "Group": "af-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "N17",
+ "Group": "af-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "N18",
+ "Group": "af-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "N19",
+ "Group": "af-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "N20",
+ "Group": "af-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "N21",
+ "Group": "au-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "N22",
+ "Group": "au-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "N23",
+ "Group": "au-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "N24",
+ "Group": "au-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "N25",
+ "Group": "au-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "NPN1",
+ "Group": "us-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "NPN2",
+ "Group": "us-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "NPN3",
+ "Group": "eu-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "NPN4",
+ "Group": "eu-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "NPN5",
+ "Group": "ap-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "NPN6",
+ "Group": "ap-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "NPN7",
+ "Group": "af-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "NPN8",
+ "Group": "af-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "NPN9",
+ "Group": "au-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ },
+ {
+ "Name": "NPN10",
+ "Group": "au-n",
+ "Template": "AWS-US-WEST-1-c5.xlarge"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test/testdata/deployednettemplates/recipes/mainnet-model/network-tpl.json b/test/testdata/deployednettemplates/recipes/mainnet-model/network-tpl.json
new file mode 100644
index 0000000000..3ab40e1ce1
--- /dev/null
+++ b/test/testdata/deployednettemplates/recipes/mainnet-model/network-tpl.json
@@ -0,0 +1,115 @@
+{
+ "network": {
+ "wallets": 100,
+ "nodes": 25
+ },
+ "instances": {
+ "relays": {
+ "config": "./configs/relay.json",
+ "type": "c5.xlarge",
+ "count": 25
+ },
+ "participatingNodes": {
+ "config": "./configs/node.json",
+ "type": "c5.xlarge",
+ "count": 25
+ },
+ "nonParticipatingNodes": {
+ "config": "./configs/nonPartNode.json",
+ "type": "c5.xlarge",
+ "count": 10
+ }
+ },
+ "groups": [
+ {
+ "name": "us-r",
+ "percent": {
+ "relays": 20,
+ "participatingNodes": 0,
+ "nonParticipatingNodes": 0
+ },
+ "region": "us-west-1"
+ },
+ {
+ "name": "us-n",
+ "percent": {
+ "relays": 0,
+ "participatingNodes": 20,
+ "nonParticipatingNodes": 20
+ },
+ "region": "us-west-1"
+ },
+ {
+ "name": "eu-r",
+ "percent": {
+ "relays": 20,
+ "participatingNodes": 0,
+ "nonParticipatingNodes": 0
+ },
+ "region": "us-west-1"
+ },
+ {
+ "name": "eu-n",
+ "percent": {
+ "relays": 0,
+ "participatingNodes": 20,
+ "nonParticipatingNodes": 20
+ },
+ "region": "us-west-1"
+ },
+ {
+ "name": "ap-r",
+ "percent": {
+ "relays": 20,
+ "participatingNodes": 0,
+ "nonParticipatingNodes": 0
+ },
+ "region": "us-west-1"
+ },
+ {
+ "name": "ap-n",
+ "percent": {
+ "relays": 0,
+ "participatingNodes": 20,
+ "nonParticipatingNodes": 20
+ },
+ "region": "us-west-1"
+ },
+ {
+ "name": "af-r",
+ "percent": {
+ "relays": 20,
+ "participatingNodes": 0,
+ "nonParticipatingNodes": 0
+ },
+ "region": "us-west-1"
+ },
+ {
+ "name": "af-n",
+ "percent": {
+ "relays": 0,
+ "participatingNodes": 20,
+ "nonParticipatingNodes": 20
+ },
+ "region": "us-west-1"
+ },
+ {
+ "name": "au-r",
+ "percent": {
+ "relays": 20,
+ "participatingNodes": 0,
+ "nonParticipatingNodes": 0
+ },
+ "region": "us-west-1"
+ },
+ {
+ "name": "au-n",
+ "percent": {
+ "relays": 0,
+ "participatingNodes": 20,
+ "nonParticipatingNodes": 20
+ },
+ "region": "us-west-1"
+ }
+ ]
+}
diff --git a/test/testdata/deployednettemplates/recipes/mainnet-model/network_performance_rules b/test/testdata/deployednettemplates/recipes/mainnet-model/network_performance_rules
new file mode 100644
index 0000000000..7193b24a6f
--- /dev/null
+++ b/test/testdata/deployednettemplates/recipes/mainnet-model/network_performance_rules
@@ -0,0 +1,75 @@
+us-n us-r 46 22
+us-r us-n 1000 22
+us-r us-r 1000 10
+us-n eu-r 37 40
+us-r eu-n 1000 40
+us-r eu-r 1000 40
+us-n ap-r 37 120
+us-r ap-n 1000 120
+us-r ap-r 1000 120
+us-n af-r 37 124
+us-r af-n 1000 124
+us-r af-r 1000 124
+us-n au-r 37 102
+us-r au-n 1000 102
+us-r au-r 1000 102
+eu-n us-r 78 40
+eu-r us-n 1000 40
+eu-r us-r 1000 40
+eu-n eu-r 98 16
+eu-r eu-n 1000 16
+eu-r eu-r 1000 10
+eu-n ap-r 78 75
+eu-r ap-n 1000 75
+eu-r ap-r 1000 75
+eu-n af-r 78 85
+eu-r af-n 1000 85
+eu-r af-r 1000 85
+eu-n au-r 78 135
+eu-r au-n 1000 135
+eu-r au-r 1000 135
+ap-n us-r 47 120
+ap-r us-n 1000 120
+ap-r us-r 1000 120
+ap-n eu-r 47 75
+ap-r eu-n 1000 75
+ap-r eu-r 1000 75
+ap-n ap-r 59 32
+ap-r ap-n 1000 32
+ap-r ap-r 1000 10
+ap-n af-r 47 202
+ap-r af-n 1000 202
+ap-r af-r 1000 202
+ap-n au-r 47 47
+ap-r au-n 1000 47
+ap-r au-r 1000 47
+af-n us-r 13 118
+af-r us-n 1000 118
+af-r us-r 1000 118
+af-n eu-r 13 85
+af-r eu-n 1000 85
+af-r eu-r 1000 85
+af-n ap-r 13 202
+af-r ap-n 1000 202
+af-r ap-r 1000 202
+af-n af-r 16 70
+af-r af-n 1000 70
+af-r af-r 1000 10
+af-n au-r 13 216
+af-r au-n 1000 216
+af-r au-r 1000 216
+au-n us-r 44 102
+au-r us-n 1000 102
+au-r us-r 1000 102
+au-n eu-r 44 136
+au-r eu-n 1000 136
+au-r eu-r 1000 136
+au-n ap-r 44 47
+au-r ap-n 1000 47
+au-r ap-r 1000 47
+au-n af-r 44 217
+au-r af-n 1000 217
+au-r af-r 1000 217
+au-n au-r 55 23
+au-r au-n 1000 23
+au-r au-r 1000 10
diff --git a/test/testdata/deployednettemplates/recipes/mainnet-model/recipe.json b/test/testdata/deployednettemplates/recipes/mainnet-model/recipe.json
new file mode 100644
index 0000000000..24f7b394e0
--- /dev/null
+++ b/test/testdata/deployednettemplates/recipes/mainnet-model/recipe.json
@@ -0,0 +1,7 @@
+{
+ "GenesisFile":"generated/genesis.json",
+ "NetworkFile":"generated/net.json",
+ "ConfigFile": "../../configs/reference.json",
+ "HostTemplatesFile": "../../hosttemplates/hosttemplates.json",
+ "TopologyFile": "generated/topology.json"
+}
diff --git a/test/testdata/deployednettemplates/recipes/network-partition/Makefile b/test/testdata/deployednettemplates/recipes/network-partition/Makefile
new file mode 100644
index 0000000000..24226bc5b6
--- /dev/null
+++ b/test/testdata/deployednettemplates/recipes/network-partition/Makefile
@@ -0,0 +1,12 @@
+PARAMS=-w 100 -R 8 -N 20 -n 100 -H 10 --node-template node.json --relay-template relay.json --non-participating-node-template nonPartNode.json
+
+all: net.json genesis.json
+
+net.json: node.json nonPartNode.json ${GOPATH}/bin/netgoal
+ netgoal generate -t net -r /tmp/wat -o net.json ${PARAMS}
+
+genesis.json: ${GOPATH}/bin/netgoal
+ netgoal generate -t genesis -r /tmp/wat -o genesis.json ${PARAMS}
+
+clean:
+ rm -f net.json genesis.json
diff --git a/test/testdata/deployednettemplates/recipes/network-partition/gen_topology.py b/test/testdata/deployednettemplates/recipes/network-partition/gen_topology.py
new file mode 100644
index 0000000000..3de7bea638
--- /dev/null
+++ b/test/testdata/deployednettemplates/recipes/network-partition/gen_topology.py
@@ -0,0 +1,71 @@
+import random
+
+node_types = {"R":8, "N":20, "NPN":2}
+node_size = {"R":"-m5d.4xl", "N":"-m5d.4xl", "NPN":"-m5d.4xl"}
+partitions = {"A":50, "B":20, "C":10, "D":10, "E":5, "F":5}
+regions = [
+ "AWS-US-EAST-2",
+ "AWS-US-WEST-1"
+]
+
+def gen_topology(ranges):
+ f = open("topology.json", "w")
+ f.write("{ \"Hosts\":\n [")
+ node_groups = {}
+
+ region_count = len(regions)
+ first = True
+ for x in node_types:
+ node_type = x
+ node_count = node_types[x]
+ region_size = node_size[x]
+ for i in range(node_count):
+ node_name = node_type + str(i+1)
+ region = regions[i%region_count]
+ # randomly assign the node to a partition
+ partition = get_partition(ranges)
+ node_groups.setdefault(partition,[]).append(node_name);
+ if (first ):
+ first = False
+ else:
+ f.write(",")
+ f.write ("\n {\n \"Name\": \"" + node_name + "\",\n \"Group\": \"" + partition + "\",\n \"Template\": \"" + region + region_size + "\"\n }" )
+
+ f.write("\n ]\n}\n")
+ f.close()
+
+ for node_group in node_groups:
+ f = open("group_" + node_group + ".txt", "w")
+ for node in node_groups[node_group]:
+ f.write(node +"\n")
+ f.close()
+
+
+def get_partition(ranges):
+ random_value = random.randint(1,100)
+ for partition_name in ranges:
+ partition_value = ranges[partition_name]
+ if random_value >= partition_value['start'] and random_value <= partition_value['end'] :
+ return partition_name
+ print("error, partition not found for random_value ", random_value)
+ exit(1)
+
+def get_ranges():
+ ranges = {}
+ start_pos = 1;
+ for name, size in partitions.items():
+ if (start_pos > 100) :
+ print("error, range exceeded 100")
+ exit(1)
+ end_pos = start_pos + size - 1
+ ranges[name] = {"start": start_pos, "end": end_pos}
+ start_pos = end_pos + 1
+ print(ranges)
+ return ranges
+
+
+# create the group ranges based on group percent size
+ranges = get_ranges()
+
+# gen the topology.json file based and assign groups
+gen_topology(ranges)
diff --git a/test/testdata/deployednettemplates/recipes/network-partition/genesis.json b/test/testdata/deployednettemplates/recipes/network-partition/genesis.json
new file mode 100644
index 0000000000..c1f7c184e9
--- /dev/null
+++ b/test/testdata/deployednettemplates/recipes/network-partition/genesis.json
@@ -0,0 +1,1013 @@
+{
+ "NetworkName": "",
+ "VersionModifier": "",
+ "ConsensusProtocol": "",
+ "FirstPartKeyRound": 0,
+ "LastPartKeyRound": 3000000,
+ "PartKeyDilution": 0,
+ "Wallets": [
+ {
+ "Name": "Wallet1",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet2",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet3",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet4",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet5",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet6",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet7",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet8",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet9",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet10",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet11",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet12",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet13",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet14",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet15",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet16",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet17",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet18",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet19",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet20",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet21",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet22",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet23",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet24",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet25",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet26",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet27",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet28",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet29",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet30",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet31",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet32",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet33",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet34",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet35",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet36",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet37",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet38",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet39",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet40",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet41",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet42",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet43",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet44",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet45",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet46",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet47",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet48",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet49",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet50",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet51",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet52",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet53",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet54",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet55",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet56",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet57",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet58",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet59",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet60",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet61",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet62",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet63",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet64",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet65",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet66",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet67",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet68",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet69",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet70",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet71",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet72",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet73",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet74",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet75",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet76",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet77",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet78",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet79",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet80",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet81",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet82",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet83",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet84",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet85",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet86",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet87",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet88",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet89",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet90",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet91",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet92",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet93",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet94",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet95",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet96",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet97",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet98",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet99",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet100",
+ "Stake": 0.5,
+ "Online": true
+ },
+ {
+ "Name": "Wallet101",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet102",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet103",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet104",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet105",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet106",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet107",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet108",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet109",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet110",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet111",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet112",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet113",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet114",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet115",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet116",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet117",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet118",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet119",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet120",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet121",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet122",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet123",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet124",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet125",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet126",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet127",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet128",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet129",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet130",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet131",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet132",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet133",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet134",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet135",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet136",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet137",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet138",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet139",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet140",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet141",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet142",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet143",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet144",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet145",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet146",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet147",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet148",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet149",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet150",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet151",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet152",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet153",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet154",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet155",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet156",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet157",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet158",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet159",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet160",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet161",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet162",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet163",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet164",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet165",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet166",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet167",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet168",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet169",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet170",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet171",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet172",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet173",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet174",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet175",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet176",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet177",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet178",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet179",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet180",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet181",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet182",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet183",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet184",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet185",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet186",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet187",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet188",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet189",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet190",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet191",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet192",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet193",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet194",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet195",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet196",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet197",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet198",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet199",
+ "Stake": 0.5,
+ "Online": false
+ },
+ {
+ "Name": "Wallet200",
+ "Stake": 0.5,
+ "Online": false
+ }
+ ],
+ "FeeSink": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ",
+ "RewardsPool": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ",
+ "Comment": ""
+}
diff --git a/test/testdata/deployednettemplates/recipes/network-partition/net.json b/test/testdata/deployednettemplates/recipes/network-partition/net.json
new file mode 100644
index 0000000000..3b2b5df750
--- /dev/null
+++ b/test/testdata/deployednettemplates/recipes/network-partition/net.json
@@ -0,0 +1,2564 @@
+{
+ "Hosts": [
+ {
+ "Name": "R1",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay1",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R2",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay2",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R3",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay3",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R4",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay4",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R5",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay5",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R6",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay6",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R7",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay7",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "R8",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "relay8",
+ "Wallets": null,
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N1",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node1",
+ "Wallets": [
+ {
+ "Name": "Wallet1",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node21",
+ "Wallets": [
+ {
+ "Name": "Wallet2",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node41",
+ "Wallets": [
+ {
+ "Name": "Wallet3",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node61",
+ "Wallets": [
+ {
+ "Name": "Wallet4",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node81",
+ "Wallets": [
+ {
+ "Name": "Wallet5",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N2",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node2",
+ "Wallets": [
+ {
+ "Name": "Wallet6",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node22",
+ "Wallets": [
+ {
+ "Name": "Wallet7",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node42",
+ "Wallets": [
+ {
+ "Name": "Wallet8",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node62",
+ "Wallets": [
+ {
+ "Name": "Wallet9",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node82",
+ "Wallets": [
+ {
+ "Name": "Wallet10",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N3",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node3",
+ "Wallets": [
+ {
+ "Name": "Wallet11",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node23",
+ "Wallets": [
+ {
+ "Name": "Wallet12",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node43",
+ "Wallets": [
+ {
+ "Name": "Wallet13",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node63",
+ "Wallets": [
+ {
+ "Name": "Wallet14",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node83",
+ "Wallets": [
+ {
+ "Name": "Wallet15",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N4",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node4",
+ "Wallets": [
+ {
+ "Name": "Wallet16",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node24",
+ "Wallets": [
+ {
+ "Name": "Wallet17",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node44",
+ "Wallets": [
+ {
+ "Name": "Wallet18",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node64",
+ "Wallets": [
+ {
+ "Name": "Wallet19",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node84",
+ "Wallets": [
+ {
+ "Name": "Wallet20",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N5",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node5",
+ "Wallets": [
+ {
+ "Name": "Wallet21",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node25",
+ "Wallets": [
+ {
+ "Name": "Wallet22",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node45",
+ "Wallets": [
+ {
+ "Name": "Wallet23",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node65",
+ "Wallets": [
+ {
+ "Name": "Wallet24",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node85",
+ "Wallets": [
+ {
+ "Name": "Wallet25",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N6",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node6",
+ "Wallets": [
+ {
+ "Name": "Wallet26",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node26",
+ "Wallets": [
+ {
+ "Name": "Wallet27",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node46",
+ "Wallets": [
+ {
+ "Name": "Wallet28",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node66",
+ "Wallets": [
+ {
+ "Name": "Wallet29",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node86",
+ "Wallets": [
+ {
+ "Name": "Wallet30",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N7",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node7",
+ "Wallets": [
+ {
+ "Name": "Wallet31",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node27",
+ "Wallets": [
+ {
+ "Name": "Wallet32",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node47",
+ "Wallets": [
+ {
+ "Name": "Wallet33",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node67",
+ "Wallets": [
+ {
+ "Name": "Wallet34",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node87",
+ "Wallets": [
+ {
+ "Name": "Wallet35",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N8",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node8",
+ "Wallets": [
+ {
+ "Name": "Wallet36",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node28",
+ "Wallets": [
+ {
+ "Name": "Wallet37",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node48",
+ "Wallets": [
+ {
+ "Name": "Wallet38",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node68",
+ "Wallets": [
+ {
+ "Name": "Wallet39",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node88",
+ "Wallets": [
+ {
+ "Name": "Wallet40",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N9",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node9",
+ "Wallets": [
+ {
+ "Name": "Wallet41",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node29",
+ "Wallets": [
+ {
+ "Name": "Wallet42",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node49",
+ "Wallets": [
+ {
+ "Name": "Wallet43",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node69",
+ "Wallets": [
+ {
+ "Name": "Wallet44",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node89",
+ "Wallets": [
+ {
+ "Name": "Wallet45",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N10",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node10",
+ "Wallets": [
+ {
+ "Name": "Wallet46",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node30",
+ "Wallets": [
+ {
+ "Name": "Wallet47",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node50",
+ "Wallets": [
+ {
+ "Name": "Wallet48",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node70",
+ "Wallets": [
+ {
+ "Name": "Wallet49",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node90",
+ "Wallets": [
+ {
+ "Name": "Wallet50",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N11",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node11",
+ "Wallets": [
+ {
+ "Name": "Wallet51",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node31",
+ "Wallets": [
+ {
+ "Name": "Wallet52",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node51",
+ "Wallets": [
+ {
+ "Name": "Wallet53",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node71",
+ "Wallets": [
+ {
+ "Name": "Wallet54",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node91",
+ "Wallets": [
+ {
+ "Name": "Wallet55",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N12",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node12",
+ "Wallets": [
+ {
+ "Name": "Wallet56",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node32",
+ "Wallets": [
+ {
+ "Name": "Wallet57",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node52",
+ "Wallets": [
+ {
+ "Name": "Wallet58",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node72",
+ "Wallets": [
+ {
+ "Name": "Wallet59",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node92",
+ "Wallets": [
+ {
+ "Name": "Wallet60",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N13",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node13",
+ "Wallets": [
+ {
+ "Name": "Wallet61",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node33",
+ "Wallets": [
+ {
+ "Name": "Wallet62",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node53",
+ "Wallets": [
+ {
+ "Name": "Wallet63",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node73",
+ "Wallets": [
+ {
+ "Name": "Wallet64",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node93",
+ "Wallets": [
+ {
+ "Name": "Wallet65",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N14",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node14",
+ "Wallets": [
+ {
+ "Name": "Wallet66",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node34",
+ "Wallets": [
+ {
+ "Name": "Wallet67",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node54",
+ "Wallets": [
+ {
+ "Name": "Wallet68",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node74",
+ "Wallets": [
+ {
+ "Name": "Wallet69",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node94",
+ "Wallets": [
+ {
+ "Name": "Wallet70",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N15",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node15",
+ "Wallets": [
+ {
+ "Name": "Wallet71",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node35",
+ "Wallets": [
+ {
+ "Name": "Wallet72",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node55",
+ "Wallets": [
+ {
+ "Name": "Wallet73",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node75",
+ "Wallets": [
+ {
+ "Name": "Wallet74",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node95",
+ "Wallets": [
+ {
+ "Name": "Wallet75",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N16",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node16",
+ "Wallets": [
+ {
+ "Name": "Wallet76",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node36",
+ "Wallets": [
+ {
+ "Name": "Wallet77",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node56",
+ "Wallets": [
+ {
+ "Name": "Wallet78",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node76",
+ "Wallets": [
+ {
+ "Name": "Wallet79",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node96",
+ "Wallets": [
+ {
+ "Name": "Wallet80",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N17",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node17",
+ "Wallets": [
+ {
+ "Name": "Wallet81",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node37",
+ "Wallets": [
+ {
+ "Name": "Wallet82",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node57",
+ "Wallets": [
+ {
+ "Name": "Wallet83",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node77",
+ "Wallets": [
+ {
+ "Name": "Wallet84",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node97",
+ "Wallets": [
+ {
+ "Name": "Wallet85",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N18",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node18",
+ "Wallets": [
+ {
+ "Name": "Wallet86",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node38",
+ "Wallets": [
+ {
+ "Name": "Wallet87",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node58",
+ "Wallets": [
+ {
+ "Name": "Wallet88",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node78",
+ "Wallets": [
+ {
+ "Name": "Wallet89",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node98",
+ "Wallets": [
+ {
+ "Name": "Wallet90",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": true,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N19",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node19",
+ "Wallets": [
+ {
+ "Name": "Wallet91",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node39",
+ "Wallets": [
+ {
+ "Name": "Wallet92",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node59",
+ "Wallets": [
+ {
+ "Name": "Wallet93",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node79",
+ "Wallets": [
+ {
+ "Name": "Wallet94",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node99",
+ "Wallets": [
+ {
+ "Name": "Wallet95",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "N20",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "node20",
+ "Wallets": [
+ {
+ "Name": "Wallet96",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node40",
+ "Wallets": [
+ {
+ "Name": "Wallet97",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node60",
+ "Wallets": [
+ {
+ "Name": "Wallet98",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node80",
+ "Wallets": [
+ {
+ "Name": "Wallet99",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ },
+ {
+ "Name": "node100",
+ "Wallets": [
+ {
+ "Name": "Wallet100",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+ }
+ ]
+ },
+ {
+ "Name": "NPN1",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "nonParticipatingNode1",
+ "Wallets": [
+ {
+ "Name": "Wallet101",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet111",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet121",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet131",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet141",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet151",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet161",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet171",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet181",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet191",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "EnableMetrics": false,
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"BaseLoggerDebugLevel\": 4 }"
+ }
+ ]
+ },
+ {
+ "Name": "NPN2",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "nonParticipatingNode2",
+ "Wallets": [
+ {
+ "Name": "Wallet102",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet112",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet122",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet132",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet142",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet152",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet162",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet172",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet182",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet192",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "EnableMetrics": false,
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"BaseLoggerDebugLevel\": 4 }"
+ }
+ ]
+ },
+ {
+ "Name": "NPN3",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "nonParticipatingNode3",
+ "Wallets": [
+ {
+ "Name": "Wallet103",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet113",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet123",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet133",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet143",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet153",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet163",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet173",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet183",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet193",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "EnableMetrics": false,
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"BaseLoggerDebugLevel\": 4 }"
+ }
+ ]
+ },
+ {
+ "Name": "NPN4",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "nonParticipatingNode4",
+ "Wallets": [
+ {
+ "Name": "Wallet104",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet114",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet124",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet134",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet144",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet154",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet164",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet174",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet184",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet194",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "EnableMetrics": false,
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"BaseLoggerDebugLevel\": 4 }"
+ }
+ ]
+ },
+ {
+ "Name": "NPN5",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "nonParticipatingNode5",
+ "Wallets": [
+ {
+ "Name": "Wallet105",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet115",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet125",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet135",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet145",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet155",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet165",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet175",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet185",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet195",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "EnableMetrics": false,
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"BaseLoggerDebugLevel\": 4 }"
+ }
+ ]
+ },
+ {
+ "Name": "NPN6",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "nonParticipatingNode6",
+ "Wallets": [
+ {
+ "Name": "Wallet106",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet116",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet126",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet136",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet146",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet156",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet166",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet176",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet186",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet196",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "EnableMetrics": false,
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"BaseLoggerDebugLevel\": 4 }"
+ }
+ ]
+ },
+ {
+ "Name": "NPN7",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "nonParticipatingNode7",
+ "Wallets": [
+ {
+ "Name": "Wallet107",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet117",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet127",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet137",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet147",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet157",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet167",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet177",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet187",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet197",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "EnableMetrics": false,
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"BaseLoggerDebugLevel\": 4 }"
+ }
+ ]
+ },
+ {
+ "Name": "NPN8",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "nonParticipatingNode8",
+ "Wallets": [
+ {
+ "Name": "Wallet108",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet118",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet128",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet138",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet148",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet158",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet168",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet178",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet188",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet198",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "EnableMetrics": false,
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"BaseLoggerDebugLevel\": 4 }"
+ }
+ ]
+ },
+ {
+ "Name": "NPN9",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "nonParticipatingNode9",
+ "Wallets": [
+ {
+ "Name": "Wallet109",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet119",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet129",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet139",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet149",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet159",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet169",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet179",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet189",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet199",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "EnableMetrics": false,
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"BaseLoggerDebugLevel\": 4 }"
+ }
+ ]
+ },
+ {
+ "Name": "NPN10",
+ "Group": "",
+ "Nodes": [
+ {
+ "Name": "nonParticipatingNode10",
+ "Wallets": [
+ {
+ "Name": "Wallet110",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet120",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet130",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet140",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet150",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet160",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet170",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet180",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet190",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet200",
+ "ParticipationOnly": false
+ }
+ ],
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableTelemetry": false,
+ "EnableMetrics": false,
+ "EnableService": false,
+ "EnableBlockStats": false,
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"BaseLoggerDebugLevel\": 4 }"
+ }
+ ]
+ }
+ ]
+}
diff --git a/test/testdata/deployednettemplates/recipes/network-partition/node.json b/test/testdata/deployednettemplates/recipes/network-partition/node.json
new file mode 100644
index 0000000000..4386fa3fd7
--- /dev/null
+++ b/test/testdata/deployednettemplates/recipes/network-partition/node.json
@@ -0,0 +1,22 @@
+{
+ "APIToken": "{{APIToken}}",
+ "EnableBlockStats": false,
+ "EnableTelemetry": false,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": false,
+ "MetricsURI": "{{MetricsURI}}",
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }",
+ "AltConfigs": [
+ {
+ "APIToken": "{{APIToken}}",
+ "EnableBlockStats": true,
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }",
+ "FractionApply": 0.2
+ }
+ ]
+}
+
diff --git a/test/testdata/deployednettemplates/recipes/network-partition/nonPartNode.json b/test/testdata/deployednettemplates/recipes/network-partition/nonPartNode.json
new file mode 100644
index 0000000000..3825bb420b
--- /dev/null
+++ b/test/testdata/deployednettemplates/recipes/network-partition/nonPartNode.json
@@ -0,0 +1,5 @@
+{
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"BaseLoggerDebugLevel\": 4 }"
+}
diff --git a/test/testdata/deployednettemplates/recipes/network-partition/recipe.json b/test/testdata/deployednettemplates/recipes/network-partition/recipe.json
new file mode 100644
index 0000000000..a2f88f63b4
--- /dev/null
+++ b/test/testdata/deployednettemplates/recipes/network-partition/recipe.json
@@ -0,0 +1,7 @@
+{
+ "GenesisFile":"genesis.json",
+ "NetworkFile":"net.json",
+ "ConfigFile": "../../configs/reference.json",
+ "HostTemplatesFile": "../../hosttemplates/hosttemplates.json",
+ "TopologyFile": "topology.json"
+}
diff --git a/test/testdata/deployednettemplates/recipes/network-partition/relay.json b/test/testdata/deployednettemplates/recipes/network-partition/relay.json
new file mode 100644
index 0000000000..25bb6b5a26
--- /dev/null
+++ b/test/testdata/deployednettemplates/recipes/network-partition/relay.json
@@ -0,0 +1,11 @@
+{
+ "NetAddress": "{{NetworkPort}}",
+ "APIEndpoint": "{{APIEndpoint}}",
+ "APIToken": "{{APIToken}}",
+ "EnableBlockStats": true,
+ "EnableTelemetry": true,
+ "TelemetryURI": "{{TelemetryURI}}",
+ "EnableMetrics": true,
+ "MetricsURI": "{{MetricsURI}}",
+ "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }"
+}
diff --git a/test/testdata/deployednettemplates/recipes/network-partition/topology.json b/test/testdata/deployednettemplates/recipes/network-partition/topology.json
new file mode 100644
index 0000000000..e050f67368
--- /dev/null
+++ b/test/testdata/deployednettemplates/recipes/network-partition/topology.json
@@ -0,0 +1,154 @@
+{ "Hosts":
+ [
+ {
+ "Name": "R1",
+ "Group": "F",
+ "Template": "AWS-US-EAST-2-m5d.4xl"
+ },
+ {
+ "Name": "R2",
+ "Group": "B",
+ "Template": "AWS-US-WEST-1-m5d.4xl"
+ },
+ {
+ "Name": "R3",
+ "Group": "A",
+ "Template": "AWS-US-EAST-2-m5d.4xl"
+ },
+ {
+ "Name": "R4",
+ "Group": "A",
+ "Template": "AWS-US-WEST-1-m5d.4xl"
+ },
+ {
+ "Name": "R5",
+ "Group": "A",
+ "Template": "AWS-US-EAST-2-m5d.4xl"
+ },
+ {
+ "Name": "R6",
+ "Group": "B",
+ "Template": "AWS-US-WEST-1-m5d.4xl"
+ },
+ {
+ "Name": "R7",
+ "Group": "A",
+ "Template": "AWS-US-EAST-2-m5d.4xl"
+ },
+ {
+ "Name": "R8",
+ "Group": "B",
+ "Template": "AWS-US-WEST-1-m5d.4xl"
+ },
+ {
+ "Name": "N1",
+ "Group": "B",
+ "Template": "AWS-US-EAST-2-m5d.4xl"
+ },
+ {
+ "Name": "N2",
+ "Group": "A",
+ "Template": "AWS-US-WEST-1-m5d.4xl"
+ },
+ {
+ "Name": "N3",
+ "Group": "B",
+ "Template": "AWS-US-EAST-2-m5d.4xl"
+ },
+ {
+ "Name": "N4",
+ "Group": "B",
+ "Template": "AWS-US-WEST-1-m5d.4xl"
+ },
+ {
+ "Name": "N5",
+ "Group": "A",
+ "Template": "AWS-US-EAST-2-m5d.4xl"
+ },
+ {
+ "Name": "N6",
+ "Group": "E",
+ "Template": "AWS-US-WEST-1-m5d.4xl"
+ },
+ {
+ "Name": "N7",
+ "Group": "A",
+ "Template": "AWS-US-EAST-2-m5d.4xl"
+ },
+ {
+ "Name": "N8",
+ "Group": "A",
+ "Template": "AWS-US-WEST-1-m5d.4xl"
+ },
+ {
+ "Name": "N9",
+ "Group": "B",
+ "Template": "AWS-US-EAST-2-m5d.4xl"
+ },
+ {
+ "Name": "N10",
+ "Group": "A",
+ "Template": "AWS-US-WEST-1-m5d.4xl"
+ },
+ {
+ "Name": "N11",
+ "Group": "E",
+ "Template": "AWS-US-EAST-2-m5d.4xl"
+ },
+ {
+ "Name": "N12",
+ "Group": "B",
+ "Template": "AWS-US-WEST-1-m5d.4xl"
+ },
+ {
+ "Name": "N13",
+ "Group": "A",
+ "Template": "AWS-US-EAST-2-m5d.4xl"
+ },
+ {
+ "Name": "N14",
+ "Group": "A",
+ "Template": "AWS-US-WEST-1-m5d.4xl"
+ },
+ {
+ "Name": "N15",
+ "Group": "B",
+ "Template": "AWS-US-EAST-2-m5d.4xl"
+ },
+ {
+ "Name": "N16",
+ "Group": "A",
+ "Template": "AWS-US-WEST-1-m5d.4xl"
+ },
+ {
+ "Name": "N17",
+ "Group": "B",
+ "Template": "AWS-US-EAST-2-m5d.4xl"
+ },
+ {
+ "Name": "N18",
+ "Group": "A",
+ "Template": "AWS-US-WEST-1-m5d.4xl"
+ },
+ {
+ "Name": "N19",
+ "Group": "C",
+ "Template": "AWS-US-EAST-2-m5d.4xl"
+ },
+ {
+ "Name": "N20",
+ "Group": "D",
+ "Template": "AWS-US-WEST-1-m5d.4xl"
+ },
+ {
+ "Name": "NPN1",
+ "Group": "A",
+ "Template": "AWS-US-EAST-2-m5d.4xl"
+ },
+ {
+ "Name": "NPN2",
+ "Group": "D",
+ "Template": "AWS-US-WEST-1-m5d.4xl"
+ }
+ ]
+}
diff --git a/test/testdata/nettemplates/TwoNodesOneRelay1000Accounts.json b/test/testdata/nettemplates/TwoNodesOneRelay1000Accounts.json
new file mode 100644
index 0000000000..9e2c09a299
--- /dev/null
+++ b/test/testdata/nettemplates/TwoNodesOneRelay1000Accounts.json
@@ -0,0 +1,9026 @@
+{
+ "Genesis": {
+ "NetworkName": "tbd",
+ "PartKeyDilution": 100,
+ "LastPartKeyRound": 20000,
+ "Wallets": [
+ {
+ "Name": "Wallet1",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet2",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet3",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet4",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet5",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet6",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet7",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet8",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet9",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet10",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet11",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet12",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet13",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet14",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet15",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet16",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet17",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet18",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet19",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet20",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet21",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet22",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet23",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet24",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet25",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet26",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet27",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet28",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet29",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet30",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet31",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet32",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet33",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet34",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet35",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet36",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet37",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet38",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet39",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet40",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet41",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet42",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet43",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet44",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet45",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet46",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet47",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet48",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet49",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet50",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet51",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet52",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet53",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet54",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet55",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet56",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet57",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet58",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet59",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet60",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet61",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet62",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet63",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet64",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet65",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet66",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet67",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet68",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet69",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet70",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet71",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet72",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet73",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet74",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet75",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet76",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet77",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet78",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet79",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet80",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet81",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet82",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet83",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet84",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet85",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet86",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet87",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet88",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet89",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet90",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet91",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet92",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet93",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet94",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet95",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet96",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet97",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet98",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet99",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet100",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet101",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet102",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet103",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet104",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet105",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet106",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet107",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet108",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet109",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet110",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet111",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet112",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet113",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet114",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet115",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet116",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet117",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet118",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet119",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet120",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet121",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet122",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet123",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet124",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet125",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet126",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet127",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet128",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet129",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet130",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet131",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet132",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet133",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet134",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet135",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet136",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet137",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet138",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet139",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet140",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet141",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet142",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet143",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet144",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet145",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet146",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet147",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet148",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet149",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet150",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet151",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet152",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet153",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet154",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet155",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet156",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet157",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet158",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet159",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet160",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet161",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet162",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet163",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet164",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet165",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet166",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet167",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet168",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet169",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet170",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet171",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet172",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet173",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet174",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet175",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet176",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet177",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet178",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet179",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet180",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet181",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet182",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet183",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet184",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet185",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet186",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet187",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet188",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet189",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet190",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet191",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet192",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet193",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet194",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet195",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet196",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet197",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet198",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet199",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet200",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet201",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet202",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet203",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet204",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet205",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet206",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet207",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet208",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet209",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet210",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet211",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet212",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet213",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet214",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet215",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet216",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet217",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet218",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet219",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet220",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet221",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet222",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet223",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet224",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet225",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet226",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet227",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet228",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet229",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet230",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet231",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet232",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet233",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet234",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet235",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet236",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet237",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet238",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet239",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet240",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet241",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet242",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet243",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet244",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet245",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet246",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet247",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet248",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet249",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet250",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet251",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet252",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet253",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet254",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet255",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet256",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet257",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet258",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet259",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet260",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet261",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet262",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet263",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet264",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet265",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet266",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet267",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet268",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet269",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet270",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet271",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet272",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet273",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet274",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet275",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet276",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet277",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet278",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet279",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet280",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet281",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet282",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet283",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet284",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet285",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet286",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet287",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet288",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet289",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet290",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet291",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet292",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet293",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet294",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet295",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet296",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet297",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet298",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet299",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet300",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet301",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet302",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet303",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet304",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet305",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet306",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet307",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet308",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet309",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet310",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet311",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet312",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet313",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet314",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet315",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet316",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet317",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet318",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet319",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet320",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet321",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet322",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet323",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet324",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet325",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet326",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet327",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet328",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet329",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet330",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet331",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet332",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet333",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet334",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet335",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet336",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet337",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet338",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet339",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet340",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet341",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet342",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet343",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet344",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet345",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet346",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet347",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet348",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet349",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet350",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet351",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet352",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet353",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet354",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet355",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet356",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet357",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet358",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet359",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet360",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet361",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet362",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet363",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet364",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet365",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet366",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet367",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet368",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet369",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet370",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet371",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet372",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet373",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet374",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet375",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet376",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet377",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet378",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet379",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet380",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet381",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet382",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet383",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet384",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet385",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet386",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet387",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet388",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet389",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet390",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet391",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet392",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet393",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet394",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet395",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet396",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet397",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet398",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet399",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet400",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet401",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet402",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet403",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet404",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet405",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet406",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet407",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet408",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet409",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet410",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet411",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet412",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet413",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet414",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet415",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet416",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet417",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet418",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet419",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet420",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet421",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet422",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet423",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet424",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet425",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet426",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet427",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet428",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet429",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet430",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet431",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet432",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet433",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet434",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet435",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet436",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet437",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet438",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet439",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet440",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet441",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet442",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet443",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet444",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet445",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet446",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet447",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet448",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet449",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet450",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet451",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet452",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet453",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet454",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet455",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet456",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet457",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet458",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet459",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet460",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet461",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet462",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet463",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet464",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet465",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet466",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet467",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet468",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet469",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet470",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet471",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet472",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet473",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet474",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet475",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet476",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet477",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet478",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet479",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet480",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet481",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet482",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet483",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet484",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet485",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet486",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet487",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet488",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet489",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet490",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet491",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet492",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet493",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet494",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet495",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet496",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet497",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet498",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet499",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet500",
+ "Stake": 0.1,
+ "Online": true
+ },
+ {
+ "Name": "Wallet501",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet502",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet503",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet504",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet505",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet506",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet507",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet508",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet509",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet510",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet511",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet512",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet513",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet514",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet515",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet516",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet517",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet518",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet519",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet520",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet521",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet522",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet523",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet524",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet525",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet526",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet527",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet528",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet529",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet530",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet531",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet532",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet533",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet534",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet535",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet536",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet537",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet538",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet539",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet540",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet541",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet542",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet543",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet544",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet545",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet546",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet547",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet548",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet549",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet550",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet551",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet552",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet553",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet554",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet555",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet556",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet557",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet558",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet559",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet560",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet561",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet562",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet563",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet564",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet565",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet566",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet567",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet568",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet569",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet570",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet571",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet572",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet573",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet574",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet575",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet576",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet577",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet578",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet579",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet580",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet581",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet582",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet583",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet584",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet585",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet586",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet587",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet588",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet589",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet590",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet591",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet592",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet593",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet594",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet595",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet596",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet597",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet598",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet599",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet600",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet601",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet602",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet603",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet604",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet605",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet606",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet607",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet608",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet609",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet610",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet611",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet612",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet613",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet614",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet615",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet616",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet617",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet618",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet619",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet620",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet621",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet622",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet623",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet624",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet625",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet626",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet627",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet628",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet629",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet630",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet631",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet632",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet633",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet634",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet635",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet636",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet637",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet638",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet639",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet640",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet641",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet642",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet643",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet644",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet645",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet646",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet647",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet648",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet649",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet650",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet651",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet652",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet653",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet654",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet655",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet656",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet657",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet658",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet659",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet660",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet661",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet662",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet663",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet664",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet665",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet666",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet667",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet668",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet669",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet670",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet671",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet672",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet673",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet674",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet675",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet676",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet677",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet678",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet679",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet680",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet681",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet682",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet683",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet684",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet685",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet686",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet687",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet688",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet689",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet690",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet691",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet692",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet693",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet694",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet695",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet696",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet697",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet698",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet699",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet700",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet701",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet702",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet703",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet704",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet705",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet706",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet707",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet708",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet709",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet710",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet711",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet712",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet713",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet714",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet715",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet716",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet717",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet718",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet719",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet720",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet721",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet722",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet723",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet724",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet725",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet726",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet727",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet728",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet729",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet730",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet731",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet732",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet733",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet734",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet735",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet736",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet737",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet738",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet739",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet740",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet741",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet742",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet743",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet744",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet745",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet746",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet747",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet748",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet749",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet750",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet751",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet752",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet753",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet754",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet755",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet756",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet757",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet758",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet759",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet760",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet761",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet762",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet763",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet764",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet765",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet766",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet767",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet768",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet769",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet770",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet771",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet772",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet773",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet774",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet775",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet776",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet777",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet778",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet779",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet780",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet781",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet782",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet783",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet784",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet785",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet786",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet787",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet788",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet789",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet790",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet791",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet792",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet793",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet794",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet795",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet796",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet797",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet798",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet799",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet800",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet801",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet802",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet803",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet804",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet805",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet806",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet807",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet808",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet809",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet810",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet811",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet812",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet813",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet814",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet815",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet816",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet817",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet818",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet819",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet820",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet821",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet822",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet823",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet824",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet825",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet826",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet827",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet828",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet829",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet830",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet831",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet832",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet833",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet834",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet835",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet836",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet837",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet838",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet839",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet840",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet841",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet842",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet843",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet844",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet845",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet846",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet847",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet848",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet849",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet850",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet851",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet852",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet853",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet854",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet855",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet856",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet857",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet858",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet859",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet860",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet861",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet862",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet863",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet864",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet865",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet866",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet867",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet868",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet869",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet870",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet871",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet872",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet873",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet874",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet875",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet876",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet877",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet878",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet879",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet880",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet881",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet882",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet883",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet884",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet885",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet886",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet887",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet888",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet889",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet890",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet891",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet892",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet893",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet894",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet895",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet896",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet897",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet898",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet899",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet900",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet901",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet902",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet903",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet904",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet905",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet906",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet907",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet908",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet909",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet910",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet911",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet912",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet913",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet914",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet915",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet916",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet917",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet918",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet919",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet920",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet921",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet922",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet923",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet924",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet925",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet926",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet927",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet928",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet929",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet930",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet931",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet932",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet933",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet934",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet935",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet936",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet937",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet938",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet939",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet940",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet941",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet942",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet943",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet944",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet945",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet946",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet947",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet948",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet949",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet950",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet951",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet952",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet953",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet954",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet955",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet956",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet957",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet958",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet959",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet960",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet961",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet962",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet963",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet964",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet965",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet966",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet967",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet968",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet969",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet970",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet971",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet972",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet973",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet974",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet975",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet976",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet977",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet978",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet979",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet980",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet981",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet982",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet983",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet984",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet985",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet986",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet987",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet988",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet989",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet990",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet991",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet992",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet993",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet994",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet995",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet996",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet997",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet998",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet999",
+ "Stake": 0.1,
+ "Online": false
+ },
+ {
+ "Name": "Wallet1000",
+ "Stake": 0.1,
+ "Online": false
+ }
+ ]
+ },
+ "Nodes": [
+ {
+ "Name": "Relay",
+ "IsRelay": true,
+ "Wallets": []
+ },
+ {
+ "Name": "Node1",
+ "Wallets": [
+ {
+ "Name": "Wallet1",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet2",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet3",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet4",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet5",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet6",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet7",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet8",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet9",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet10",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet11",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet12",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet13",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet14",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet15",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet16",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet17",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet18",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet19",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet20",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet21",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet22",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet23",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet24",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet25",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet26",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet27",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet28",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet29",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet30",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet31",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet32",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet33",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet34",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet35",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet36",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet37",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet38",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet39",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet40",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet41",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet42",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet43",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet44",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet45",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet46",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet47",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet48",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet49",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet50",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet51",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet52",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet53",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet54",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet55",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet56",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet57",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet58",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet59",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet60",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet61",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet62",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet63",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet64",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet65",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet66",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet67",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet68",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet69",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet70",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet71",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet72",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet73",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet74",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet75",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet76",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet77",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet78",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet79",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet80",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet81",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet82",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet83",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet84",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet85",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet86",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet87",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet88",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet89",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet90",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet91",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet92",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet93",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet94",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet95",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet96",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet97",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet98",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet99",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet100",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet101",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet102",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet103",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet104",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet105",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet106",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet107",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet108",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet109",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet110",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet111",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet112",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet113",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet114",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet115",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet116",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet117",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet118",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet119",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet120",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet121",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet122",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet123",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet124",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet125",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet126",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet127",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet128",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet129",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet130",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet131",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet132",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet133",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet134",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet135",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet136",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet137",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet138",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet139",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet140",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet141",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet142",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet143",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet144",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet145",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet146",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet147",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet148",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet149",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet150",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet151",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet152",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet153",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet154",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet155",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet156",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet157",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet158",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet159",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet160",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet161",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet162",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet163",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet164",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet165",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet166",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet167",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet168",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet169",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet170",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet171",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet172",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet173",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet174",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet175",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet176",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet177",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet178",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet179",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet180",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet181",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet182",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet183",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet184",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet185",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet186",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet187",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet188",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet189",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet190",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet191",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet192",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet193",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet194",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet195",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet196",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet197",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet198",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet199",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet200",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet201",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet202",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet203",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet204",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet205",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet206",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet207",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet208",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet209",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet210",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet211",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet212",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet213",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet214",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet215",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet216",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet217",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet218",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet219",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet220",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet221",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet222",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet223",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet224",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet225",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet226",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet227",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet228",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet229",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet230",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet231",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet232",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet233",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet234",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet235",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet236",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet237",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet238",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet239",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet240",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet241",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet242",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet243",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet244",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet245",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet246",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet247",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet248",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet249",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet250",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet251",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet252",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet253",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet254",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet255",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet256",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet257",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet258",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet259",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet260",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet261",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet262",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet263",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet264",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet265",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet266",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet267",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet268",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet269",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet270",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet271",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet272",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet273",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet274",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet275",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet276",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet277",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet278",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet279",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet280",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet281",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet282",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet283",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet284",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet285",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet286",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet287",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet288",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet289",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet290",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet291",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet292",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet293",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet294",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet295",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet296",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet297",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet298",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet299",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet300",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet301",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet302",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet303",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet304",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet305",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet306",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet307",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet308",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet309",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet310",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet311",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet312",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet313",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet314",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet315",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet316",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet317",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet318",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet319",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet320",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet321",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet322",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet323",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet324",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet325",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet326",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet327",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet328",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet329",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet330",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet331",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet332",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet333",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet334",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet335",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet336",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet337",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet338",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet339",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet340",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet341",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet342",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet343",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet344",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet345",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet346",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet347",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet348",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet349",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet350",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet351",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet352",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet353",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet354",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet355",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet356",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet357",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet358",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet359",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet360",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet361",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet362",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet363",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet364",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet365",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet366",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet367",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet368",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet369",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet370",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet371",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet372",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet373",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet374",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet375",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet376",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet377",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet378",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet379",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet380",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet381",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet382",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet383",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet384",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet385",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet386",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet387",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet388",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet389",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet390",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet391",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet392",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet393",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet394",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet395",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet396",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet397",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet398",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet399",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet400",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet401",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet402",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet403",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet404",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet405",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet406",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet407",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet408",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet409",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet410",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet411",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet412",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet413",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet414",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet415",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet416",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet417",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet418",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet419",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet420",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet421",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet422",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet423",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet424",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet425",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet426",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet427",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet428",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet429",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet430",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet431",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet432",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet433",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet434",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet435",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet436",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet437",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet438",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet439",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet440",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet441",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet442",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet443",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet444",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet445",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet446",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet447",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet448",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet449",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet450",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet451",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet452",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet453",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet454",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet455",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet456",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet457",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet458",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet459",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet460",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet461",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet462",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet463",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet464",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet465",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet466",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet467",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet468",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet469",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet470",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet471",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet472",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet473",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet474",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet475",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet476",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet477",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet478",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet479",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet480",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet481",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet482",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet483",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet484",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet485",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet486",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet487",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet488",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet489",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet490",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet491",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet492",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet493",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet494",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet495",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet496",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet497",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet498",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet499",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet500",
+ "ParticipationOnly": false
+ }
+ ]
+ },
+ {
+ "Name": "Node2",
+ "Wallets": [
+ {
+ "Name": "Wallet501",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet502",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet503",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet504",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet505",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet506",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet507",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet508",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet509",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet510",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet511",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet512",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet513",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet514",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet515",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet516",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet517",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet518",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet519",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet520",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet521",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet522",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet523",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet524",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet525",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet526",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet527",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet528",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet529",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet530",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet531",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet532",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet533",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet534",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet535",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet536",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet537",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet538",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet539",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet540",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet541",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet542",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet543",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet544",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet545",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet546",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet547",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet548",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet549",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet550",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet551",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet552",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet553",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet554",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet555",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet556",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet557",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet558",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet559",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet560",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet561",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet562",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet563",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet564",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet565",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet566",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet567",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet568",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet569",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet570",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet571",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet572",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet573",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet574",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet575",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet576",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet577",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet578",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet579",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet580",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet581",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet582",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet583",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet584",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet585",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet586",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet587",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet588",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet589",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet590",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet591",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet592",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet593",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet594",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet595",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet596",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet597",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet598",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet599",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet600",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet601",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet602",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet603",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet604",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet605",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet606",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet607",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet608",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet609",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet610",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet611",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet612",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet613",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet614",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet615",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet616",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet617",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet618",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet619",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet620",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet621",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet622",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet623",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet624",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet625",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet626",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet627",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet628",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet629",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet630",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet631",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet632",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet633",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet634",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet635",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet636",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet637",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet638",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet639",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet640",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet641",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet642",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet643",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet644",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet645",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet646",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet647",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet648",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet649",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet650",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet651",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet652",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet653",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet654",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet655",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet656",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet657",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet658",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet659",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet660",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet661",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet662",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet663",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet664",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet665",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet666",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet667",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet668",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet669",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet670",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet671",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet672",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet673",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet674",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet675",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet676",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet677",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet678",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet679",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet680",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet681",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet682",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet683",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet684",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet685",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet686",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet687",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet688",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet689",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet690",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet691",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet692",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet693",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet694",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet695",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet696",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet697",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet698",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet699",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet700",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet701",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet702",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet703",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet704",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet705",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet706",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet707",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet708",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet709",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet710",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet711",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet712",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet713",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet714",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet715",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet716",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet717",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet718",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet719",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet720",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet721",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet722",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet723",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet724",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet725",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet726",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet727",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet728",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet729",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet730",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet731",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet732",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet733",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet734",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet735",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet736",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet737",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet738",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet739",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet740",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet741",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet742",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet743",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet744",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet745",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet746",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet747",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet748",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet749",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet750",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet751",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet752",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet753",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet754",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet755",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet756",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet757",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet758",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet759",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet760",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet761",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet762",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet763",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet764",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet765",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet766",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet767",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet768",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet769",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet770",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet771",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet772",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet773",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet774",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet775",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet776",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet777",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet778",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet779",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet780",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet781",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet782",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet783",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet784",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet785",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet786",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet787",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet788",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet789",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet790",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet791",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet792",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet793",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet794",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet795",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet796",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet797",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet798",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet799",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet800",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet801",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet802",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet803",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet804",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet805",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet806",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet807",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet808",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet809",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet810",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet811",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet812",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet813",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet814",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet815",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet816",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet817",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet818",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet819",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet820",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet821",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet822",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet823",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet824",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet825",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet826",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet827",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet828",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet829",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet830",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet831",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet832",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet833",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet834",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet835",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet836",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet837",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet838",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet839",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet840",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet841",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet842",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet843",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet844",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet845",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet846",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet847",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet848",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet849",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet850",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet851",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet852",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet853",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet854",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet855",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet856",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet857",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet858",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet859",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet860",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet861",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet862",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet863",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet864",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet865",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet866",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet867",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet868",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet869",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet870",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet871",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet872",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet873",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet874",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet875",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet876",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet877",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet878",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet879",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet880",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet881",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet882",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet883",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet884",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet885",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet886",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet887",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet888",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet889",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet890",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet891",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet892",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet893",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet894",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet895",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet896",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet897",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet898",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet899",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet900",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet901",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet902",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet903",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet904",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet905",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet906",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet907",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet908",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet909",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet910",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet911",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet912",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet913",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet914",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet915",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet916",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet917",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet918",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet919",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet920",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet921",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet922",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet923",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet924",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet925",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet926",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet927",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet928",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet929",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet930",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet931",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet932",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet933",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet934",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet935",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet936",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet937",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet938",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet939",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet940",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet941",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet942",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet943",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet944",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet945",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet946",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet947",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet948",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet949",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet950",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet951",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet952",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet953",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet954",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet955",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet956",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet957",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet958",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet959",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet960",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet961",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet962",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet963",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet964",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet965",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet966",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet967",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet968",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet969",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet970",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet971",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet972",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet973",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet974",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet975",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet976",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet977",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet978",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet979",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet980",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet981",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet982",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet983",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet984",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet985",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet986",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet987",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet988",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet989",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet990",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet991",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet992",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet993",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet994",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet995",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet996",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet997",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet998",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet999",
+ "ParticipationOnly": false
+ },
+ {
+ "Name": "Wallet1000",
+ "ParticipationOnly": false
+ }
+ ]
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/tools/network/cloudflare/cloudflare.go b/tools/network/cloudflare/cloudflare.go
index 80c4f13544..122fe00c22 100644
--- a/tools/network/cloudflare/cloudflare.go
+++ b/tools/network/cloudflare/cloudflare.go
@@ -103,7 +103,7 @@ func (d *DNS) ClearSRVRecord(ctx context.Context, name string, target string, se
return err
}
if len(entries) == 0 {
- fmt.Printf("No SRV entry for '%s'='%s'.\n", name, target)
+ fmt.Printf("No SRV entry for '[%s.%s.]%s'='%s'.\n", service, protocol, name, target)
return nil
}
diff --git a/tools/teal/examples/limitorder.sh b/tools/teal/examples/limitorder.sh
index 09e0a5360a..5d6b7bb95b 100755
--- a/tools/teal/examples/limitorder.sh
+++ b/tools/teal/examples/limitorder.sh
@@ -5,7 +5,7 @@ goal asset create -d . --creator G5PM2K5RIEHHO7ZKR2ZTQDYY6DVBYOMGOFZMMNGJCW4BYNM
# > Issued transaction from account G5PM2K5RIEHHO7ZKR2ZTQDYY6DVBYOMGOFZMMNGJCW4BYNMT7HC4HTZIDU, txid JH7M5L43YLQ5DTRIVVBUUB2E4BFE7TPVAPPEGCUVNYSFRLT55Z3Q (fee 1000)
# > Transaction JH7M5L43YLQ5DTRIVVBUUB2E4BFE7TPVAPPEGCUVNYSFRLT55Z3Q still pending as of round 148369
# > Transaction JH7M5L43YLQ5DTRIVVBUUB2E4BFE7TPVAPPEGCUVNYSFRLT55Z3Q committed in round 148371
-goal asset info --creator G5PM2K5RIEHHO7ZKR2ZTQDYY6DVBYOMGOFZMMNGJCW4BYNMT7HC4HTZIDU -d . --asset e.g.Coin
+goal asset info --creator G5PM2K5RIEHHO7ZKR2ZTQDYY6DVBYOMGOFZMMNGJCW4BYNMT7HC4HTZIDU -d . --unitname e.g.Coin
# > Asset ID: 39
# > Creator: G5PM2K5RIEHHO7ZKR2ZTQDYY6DVBYOMGOFZMMNGJCW4BYNMT7HC4HTZIDU
# > Asset name:
diff --git a/util/bloom/bloom.go b/util/bloom/bloom.go
index 3230094023..21ec4454f6 100644
--- a/util/bloom/bloom.go
+++ b/util/bloom/bloom.go
@@ -96,6 +96,14 @@ func (f *Filter) MarshalBinary() ([]byte, error) {
return data, nil
}
+// BinaryMarshalLength returns the length of a binary marshaled filter ( in bytes ) using the
+// optimal configuration for the given number of elements with the desired false positive rate.
+func BinaryMarshalLength(numElements int, falsePositiveRate float64) int64 {
+ sizeBits, _ := Optimal(numElements, falsePositiveRate)
+ filterBytes := int64((sizeBits + 7) / 8) // convert bits -> bytes.
+ return filterBytes + 8 // adding 8 to match 4 prefix array, plus 4 bytes for the numHashes uint32
+}
+
// UnmarshalBinary restores the state of the filter from raw data
func UnmarshalBinary(data []byte) (*Filter, error) {
f := &Filter{}
diff --git a/util/bloom/bloom_test.go b/util/bloom/bloom_test.go
index 9f7486b504..f755fb62af 100644
--- a/util/bloom/bloom_test.go
+++ b/util/bloom/bloom_test.go
@@ -12,6 +12,8 @@ import (
"log"
"math"
"testing"
+
+ "github.com/stretchr/testify/require"
)
func TestBitset(t *testing.T) {
@@ -228,3 +230,20 @@ func TestEmptyFilter(t *testing.T) {
f.Test([]byte{1, 2, 3, 4, 5})
}
}
+
+// TestBinaryMarshalLength tests various sizes of bloom filters and ensures that the encoded binary
+// size is equal to the one reported by BinaryMarshalLength.
+func TestBinaryMarshalLength(t *testing.T) {
+ for _, elementCount := range []int{2, 16, 1024, 32768, 5101, 100237, 144539} {
+ for _, falsePositiveRate := range []float64{0.2, 0.1, 0.01, 0.001, 0.00001, 0.0000001} {
+ sizeBits, numHashes := Optimal(elementCount, falsePositiveRate)
+ filter := New(sizeBits, numHashes, 1234)
+ require.NotNil(t, filter)
+ bytes, err := filter.MarshalBinary()
+ require.NoError(t, err)
+ require.NotZero(t, len(bytes))
+ calculatedBytesLength := BinaryMarshalLength(elementCount, falsePositiveRate)
+ require.Equal(t, calculatedBytesLength, int64(len(bytes)))
+ }
+ }
+}
diff --git a/util/db/dbutil_test.go b/util/db/dbutil_test.go
index 0cb7af8a56..49717619a5 100644
--- a/util/db/dbutil_test.go
+++ b/util/db/dbutil_test.go
@@ -418,3 +418,47 @@ func TestSetSynchronousMode(t *testing.T) {
}
}
}
+
+// TestReadingWhileWriting tests the SQLite behaviour when we're using two transactions, writing with one and reading from the other.
+// it demonstates that at any time before we're calling Commit, the database content can be read, and it's containing it's pre-transaction
+// value.
+func TestReadingWhileWriting(t *testing.T) {
+ writeAcc, err := MakeAccessor("fn.db", false, false)
+ require.NoError(t, err)
+ defer os.Remove("fn.db")
+ defer os.Remove("fn.db-shm")
+ defer os.Remove("fn.db-wal")
+ defer writeAcc.Close()
+ readAcc, err := MakeAccessor("fn.db", true, false)
+ require.NoError(t, err)
+ defer readAcc.Close()
+ _, err = writeAcc.Handle.Exec("CREATE TABLE foo (a INTEGER, b INTEGER)")
+ require.NoError(t, err)
+
+ _, err = writeAcc.Handle.Exec("INSERT INTO foo(a,b) VALUES (1,1)")
+ require.NoError(t, err)
+
+ var count int
+ err = readAcc.Handle.QueryRow("SELECT count(*) FROM foo").Scan(&count)
+ require.NoError(t, err)
+ require.Equal(t, 1, count)
+
+ err = writeAcc.Atomic(func(ctx context.Context, tx *sql.Tx) error {
+ _, err = tx.Exec("INSERT INTO foo(a,b) VALUES (2,2)")
+ if err != nil {
+ return err
+ }
+ err = readAcc.Handle.QueryRow("SELECT count(*) FROM foo").Scan(&count)
+ if err != nil {
+ return err
+ }
+ return nil
+ })
+ require.NoError(t, err)
+ // this should be 1, since it was queried before the commit.
+ require.Equal(t, 1, count)
+ err = readAcc.Handle.QueryRow("SELECT count(*) FROM foo").Scan(&count)
+ require.NoError(t, err)
+ require.Equal(t, 2, count)
+
+}
diff --git a/util/metrics/counter.go b/util/metrics/counter.go
index 8641b1f4be..2cf614d491 100644
--- a/util/metrics/counter.go
+++ b/util/metrics/counter.go
@@ -21,6 +21,7 @@ import (
"strconv"
"strings"
"sync/atomic"
+ "time"
)
// MakeCounter create a new counter with the provided name and description.
@@ -36,6 +37,11 @@ func MakeCounter(metric MetricName) *Counter {
return c
}
+// NewCounter is a shortcut to MakeCounter in one shorter line.
+func NewCounter(name, desc string) *Counter {
+ return MakeCounter(MetricName{Name: name, Description: desc})
+}
+
// Register registers the counter with the default/specific registry
func (counter *Counter) Register(reg *Registry) {
if reg == nil {
@@ -99,6 +105,12 @@ func (counter *Counter) AddUint64(x uint64, labels map[string]string) {
}
}
+// AddMicrosecondsSince increases counter by microseconds between Time t and now.
+// Fastest if labels is nil
+func (counter *Counter) AddMicrosecondsSince(t time.Time, labels map[string]string) {
+ counter.AddUint64(uint64(time.Now().Sub(t).Microseconds()), labels)
+}
+
func (counter *Counter) fastAddUint64(x uint64) {
if atomic.AddUint64(&counter.intValue, x) == x {
// What we just added is the whole value, this
diff --git a/util/process_common.go b/util/process_common.go
new file mode 100644
index 0000000000..ae74344470
--- /dev/null
+++ b/util/process_common.go
@@ -0,0 +1,28 @@
+// Copyright (C) 2019-2020 Algorand, Inc.
+// This file is part of go-algorand
+//
+// go-algorand is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// go-algorand is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with go-algorand. If not, see .
+
+// +build !windows
+
+package util
+
+import (
+ "syscall"
+)
+
+// KillProcess kills a running OS process
+func KillProcess(pid int, sig syscall.Signal) error {
+ return syscall.Kill(pid, sig)
+}
diff --git a/util/process_windows.go b/util/process_windows.go
new file mode 100644
index 0000000000..9bb6703253
--- /dev/null
+++ b/util/process_windows.go
@@ -0,0 +1,67 @@
+// Copyright (C) 2019-2020 Algorand, Inc.
+// This file is part of go-algorand
+//
+// go-algorand is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// go-algorand is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with go-algorand. If not, see .
+
+// +build windows
+
+package util
+
+import (
+ "os"
+ "unsafe"
+
+ "golang.org/x/sys/windows"
+)
+
+// KillProcess kills a running OS process
+func KillProcess(pid int, _ os.Signal) error {
+
+ p, err := os.FindProcess(pid)
+ if err == nil {
+
+ for _, v := range getChildrenProcesses(pid) {
+ _ = v.Kill()
+ }
+
+ err = p.Kill()
+ }
+ return err
+}
+
+func getChildrenProcesses(parentPid int) []*os.Process {
+ out := []*os.Process{}
+ snap, err := windows.CreateToolhelp32Snapshot(windows.TH32CS_SNAPPROCESS, uint32(0))
+ if err == nil {
+ var pe32 windows.ProcessEntry32
+
+ defer windows.CloseHandle(snap)
+
+ pe32.Size = uint32(unsafe.Sizeof(pe32))
+ if err := windows.Process32First(snap, &pe32); err == nil {
+ for {
+ if pe32.ParentProcessID == uint32(parentPid) {
+ p, err := os.FindProcess(int(pe32.ProcessID))
+ if err == nil {
+ out = append(out, p)
+ }
+ }
+ if err = windows.Process32Next(snap, &pe32); err != nil {
+ break
+ }
+ }
+ }
+ }
+ return out
+}
diff --git a/util/util.go b/util/util.go
index 2959e4904f..7dcb5ba310 100644
--- a/util/util.go
+++ b/util/util.go
@@ -14,6 +14,8 @@
// You should have received a copy of the GNU Affero General Public License
// along with go-algorand. If not, see .
+// +build !windows
+
package util
import (
@@ -37,3 +39,24 @@ func RaiseRlimit(amount uint64) error {
}
return nil
}
+
+// Getrusage gets file descriptors usage statistics
+func Getrusage(who int, rusage *syscall.Rusage) (err error) {
+ err = syscall.Getrusage(who, rusage)
+ return
+}
+
+// GetCurrentProcessTimes gets current process kernel and usermode times
+func GetCurrentProcessTimes() (utime int64, stime int64, err error) {
+ var usage syscall.Rusage
+
+ err = syscall.Getrusage(syscall.RUSAGE_SELF, &usage)
+ if err == nil {
+ utime = usage.Utime.Nano()
+ stime = usage.Stime.Nano()
+ } else {
+ utime = 0
+ stime = 0
+ }
+ return
+}
diff --git a/util/util_windows.go b/util/util_windows.go
new file mode 100644
index 0000000000..a43de1e3be
--- /dev/null
+++ b/util/util_windows.go
@@ -0,0 +1,65 @@
+// Copyright (C) 2019-2020 Algorand, Inc.
+// This file is part of go-algorand
+//
+// go-algorand is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// go-algorand is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with go-algorand. If not, see .
+
+package util
+
+import (
+ "errors"
+ "syscall"
+ "time"
+)
+
+/* misc */
+
+// RaiseRlimit increases the number of file descriptors we can have
+func RaiseRlimit(_ uint64) error {
+ return nil
+}
+
+// Getrusage gets file descriptors usage statistics
+func Getrusage(who int, rusage *syscall.Rusage) (err error) {
+ if rusage != nil {
+ *rusage = syscall.Rusage{}
+ err = nil
+ } else {
+ err = errors.New("invalid parameter")
+ }
+ return
+}
+
+// GetCurrentProcessTimes gets current process kernel and usermode times
+func GetCurrentProcessTimes() (utime int64, stime int64, err error) {
+ var Ktime, Utime syscall.Filetime
+ var handle syscall.Handle
+
+ handle, err = syscall.GetCurrentProcess()
+ if err == nil {
+ err = syscall.GetProcessTimes(handle, nil, nil, &Ktime, &Utime)
+ }
+ if err == nil {
+ utime = filetimeToDuration(&Utime).Nanoseconds()
+ stime = filetimeToDuration(&Ktime).Nanoseconds()
+ } else {
+ utime = 0
+ stime = 0
+ }
+ return
+}
+
+func filetimeToDuration(ft *syscall.Filetime) time.Duration {
+ n := int64(ft.HighDateTime)<<32 + int64(ft.LowDateTime) // in 100-nanosecond intervals
+ return time.Duration(n * 100)
+}