Updated JS library and added modifications to support dev mode. (#306)

This commit is contained in:
Kithmini Gunawardhana
2023-12-08 10:11:03 +05:30
committed by GitHub
parent 97ab49a8b3
commit 0c3fb2daeb
9 changed files with 121 additions and 80 deletions

View File

@@ -47,7 +47,7 @@ Run `make installer` ('installer.tar.gz' will be placed in build directory)
1. Node app which is listening to the host xrpl account.
1. `cd mb-xrpl && npm install` (You only have to do this once)
1. `node app.js new [address] [secret] [governerAddress] [domain or ip] [leaseAmount] [rippledServer]` will create new config files called `mb-xrpl.cfg` and `secret.cfg`
1. `node app.js new [address] [secretPath] [governorAddress] [domain or ip] [leaseAmount] [rippledServer] [ipv6Subnet] [ipv6Interface] [network]` will create new config files called `mb-xrpl.cfg` and `secret.cfg`
1. `node app.js betagen [governerAddress] [domain or ip] [leaseAmount]` will generate beta host account and populate the configs.
1. `node app.js register [countryCode] [cpuMicroSec] [ramKb] [swapKb] [diskKb] [totalInstanceCount] [cpuModel] [cpuCount] [cpuSpeed] [emailAddress] [description(optional)]` will register the host on Evernode.
1. `node app.js deregister` will deregister the host from Evernode.

View File

@@ -304,53 +304,57 @@ const funcs = {
governorAddress: governorAddress
});
const xrplApi = new evernode.XrplApi(null, { autoReconnect: false });
await xrplApi.connect();
try {
const xrplApi = new evernode.XrplApi(null, { autoReconnect: false });
await xrplApi.connect();
evernode.Defaults.set({
xrplApi: xrplApi
});
evernode.Defaults.set({
xrplApi: xrplApi
});
const hostClient = new evernode.HostClient(accountAddress, null);
const terminateConnections = async () => {
await hostClient.disconnect();
await xrplApi.disconnect();
}
let attempts = 0;
let balance = 0;
while (attempts >= 0) {
try {
// In order to handle the account not found issue via catch block.
await hostClient.connect();
await new Promise(resolve => setTimeout(resolve, 1000));
if (tokenType === 'NATIVE')
balance = Number((await hostClient.xrplAcc.getInfo()).Balance) / 1000000;
else
balance = Number(await hostClient.getEVRBalance());
if (balance < expectedBalance) {
if (++attempts <= WAIT_PERIOD)
continue;
await terminateConnections();
return { success: false, result: "Funds not received within timeout." };
}
break;
} catch (err) {
if (err.data?.error === 'actNotFound' && ++attempts <= WAIT_PERIOD) {
await new Promise(resolve => setTimeout(resolve, 1000));
continue;
}
await terminateConnections();
return { success: false, result: (err.data?.error === 'actNotFound') ? "Funds not received within timeout." : "Error occurred in account balance check." };
const hostClient = new evernode.HostClient(accountAddress, null);
const terminateConnections = async () => {
await hostClient.disconnect();
await xrplApi.disconnect();
}
}
await terminateConnections();
return { success: true, result: `${balance}` };
let attempts = 0;
let balance = 0;
while (attempts >= 0) {
try {
// In order to handle the account not found issue via catch block.
await hostClient.connect();
await new Promise(resolve => setTimeout(resolve, 1000));
if (tokenType === 'NATIVE')
balance = Number((await hostClient.xrplAcc.getInfo()).Balance) / 1000000;
else
balance = Number(await hostClient.getEVRBalance());
if (balance < expectedBalance) {
if (++attempts <= WAIT_PERIOD)
continue;
await terminateConnections();
return { success: false, result: "Funds not received within timeout." };
}
break;
} catch (err) {
if (err.data?.error === 'actNotFound' && ++attempts <= WAIT_PERIOD) {
await new Promise(resolve => setTimeout(resolve, 1000));
continue;
}
await terminateConnections();
return { success: false, result: (err.data?.error === 'actNotFound') ? "Funds not received within timeout." : "Error occurred in account balance check." };
}
}
await terminateConnections();
return { success: true, result: `${balance}` };
} catch {
return { success: false, result: "Error occurred in websocket connection." };
}
},
'generate-account': async (args) => {

View File

@@ -6,7 +6,7 @@
"": {
"name": "evernode-setup-helper",
"dependencies": {
"evernode-js-client": "0.6.21",
"evernode-js-client": "0.6.23",
"ip6addr": "0.2.5",
"ripple-keypairs": "1.3.1"
}
@@ -364,9 +364,9 @@
}
},
"node_modules/evernode-js-client": {
"version": "0.6.21",
"resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.6.21.tgz",
"integrity": "sha512-Q5P6caMTzx3xaUNKhnP1vJTw3wTP/d2J2xSQEMn4m1+t/t67d8+eii3/FeQapRBSZEbNRHm9EbRry9PJhb9xcg==",
"version": "0.6.23",
"resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.6.23.tgz",
"integrity": "sha512-MXnQLkusq8UGDcf91bSmm9AVOQ3DSfSCJwWbuQpZDsXflbK5X6Ivxjj3ABQafGjAtQLn2KDKtlfzEwRzZvpkOQ==",
"dependencies": {
"elliptic": "6.5.4",
"libsodium-wrappers": "0.7.10",
@@ -1543,9 +1543,9 @@
}
},
"evernode-js-client": {
"version": "0.6.21",
"resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.6.21.tgz",
"integrity": "sha512-Q5P6caMTzx3xaUNKhnP1vJTw3wTP/d2J2xSQEMn4m1+t/t67d8+eii3/FeQapRBSZEbNRHm9EbRry9PJhb9xcg==",
"version": "0.6.23",
"resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.6.23.tgz",
"integrity": "sha512-MXnQLkusq8UGDcf91bSmm9AVOQ3DSfSCJwWbuQpZDsXflbK5X6Ivxjj3ABQafGjAtQLn2KDKtlfzEwRzZvpkOQ==",
"requires": {
"elliptic": "6.5.4",
"libsodium-wrappers": "0.7.10",

View File

@@ -4,7 +4,7 @@
"build": "ncc build index.js --minify -o dist"
},
"dependencies": {
"evernode-js-client": "0.6.21",
"evernode-js-client": "0.6.23",
"ip6addr": "0.2.5",
"ripple-keypairs": "1.3.1"
}

View File

@@ -69,6 +69,7 @@ export MB_XRPL_USER="sashimbxrpl"
export CG_SUFFIX="-cg"
export EVERNODE_AUTO_UPDATE_SERVICE="evernode-auto-update"
# TODO Change this to mainnet in release branch while using devnet in main branch.
export NETWORK="${NETWORK:-devnet}"
# Private docker registry (not used for now)
@@ -891,29 +892,17 @@ function set_host_xrpl_account() {
# Check for saved secrets due to a previous installation.
if [[ -f "$secret_backup_location" || -f "$key_file_path" ]]; then
key_file_dir=$(dirname "$key_file_path")
if [ ! -d "$key_file_dir" ]; then
mkdir -p "$key_file_dir"
fi
if [ -f "$secret_backup_location" ]; then
echomult "Retrived account details via a backed-up secret." && mv $secret_backup_location $key_file_path
else
echomult "Retrived account details via a previously specified secret."
fi
local existing_secret=$(jq -r '.xrpl.secret' "$key_file_path" 2>/dev/null)
if [ "$existing_secret" != "null" ] && [ "$existing_secret" != "-" ]; then
account_json=$(exec_jshelper generate-account $existing_secret)
xrpl_address=$(jq -r '.address' <<< "$account_json")
xrpl_secret=$(jq -r '.secret' <<< "$account_json")
generate_and_save_keyfile "$key_file_path"
key_file_dir=$(dirname "$key_file_path")
if [ ! -d "$key_file_dir" ]; then
mkdir -p "$key_file_dir"
fi
# Modify the permissions accordingly
chown $MB_XRPL_USER: $key_file_path && \
chmod 600 $key_file_path || (echomult "Error occurred in secret restoring." && exit 1)
else
echomult "Error: Backup secret file format does not support." && exit 1
fi
else
echomult "Generating new keypair for the host...\n"

View File

@@ -17,7 +17,7 @@ async function main() {
const accountAddress = process.argv[3];
const accountSecretPath = process.argv[4];
const governorAddress = process.argv[5];
// const domain = process.argv[6];
const domain = process.argv[6];
const leaseAmount = process.argv[7];
const rippledServer = process.argv[8];
const ipv6Subnet = (process.argv[9] === '-') ? null : process.argv[9];
@@ -25,6 +25,10 @@ async function main() {
const network = process.argv.length > 11 ? process.argv[11] : appenv.NETWORK;
const setup = new Setup();
setup.newConfig(accountAddress, accountSecretPath, governorAddress, parseFloat(leaseAmount), rippledServer, ipv6Subnet, ipv6NetInterface, network);
if (appenv.IS_DEV_MODE) {
await setup.prepareHostAccount(domain);
}
}
else if (process.argv.length === 7 && process.argv[2] === 'betagen') {
const governorAddress = process.argv[3];
@@ -81,7 +85,7 @@ async function main() {
console.log(`Usage:
node index.js - Run message board.
node index.js version - Print version.
node index.js new [address] [secret] [governorAddress] [leaseAmount] [rippledServer] [ipv6Subnet] [ipv6Interface] [network] - Create new config files.
node index.js new [address] [secretPath] [governorAddress] [domain or ip] [leaseAmount] [rippledServer] [ipv6Subnet] [ipv6Interface] [network] - Create new config files.
node index.js betagen [governorAddress] [domain or ip] [leaseAmount] [rippledServer] - Generate beta host account and populate the configs.
node index.js register [countryCode] [cpuMicroSec] [ramKb] [swapKb] [diskKb] [totalInstanceCount] [description] [network] - Register the host on Evernode.
node index.js transfer [transfereeAddress] - Initiate a transfer.

View File

@@ -79,6 +79,50 @@ class Setup {
this.#saveConfig(ipv6NetInterface ? { ...baseConfig, networking: { ipv6: { subnet: ipv6Subnet, interface: ipv6NetInterface } } } : baseConfig);
}
async prepareHostAccount(domain) {
const config = this.#getConfig();
const acc = config.xrpl;
await setEvernodeDefaults(acc.network, acc.governorAddress, acc.rippledServer);
// Prepare host account.
{
const hostClient = new evernode.HostClient(acc.address, acc.secret);
await hostClient.connect();
// Update the Defaults with "xrplApi" of the client.
evernode.Defaults.set({
xrplApi: hostClient.xrplApi
});
console.log(`Preparing host account:${acc.address} (domain:${domain} registry:${hostClient.config.registryAddress})`);
// Sometimes we may get 'account not found' error from rippled when some servers in the cluster
// haven't still updated the ledger. In such cases, we retry several times before giving up.
{
let attempts = 0;
while (attempts >= 0) {
try {
await hostClient.prepareAccount(domain);
break;
}
catch (err) {
if (err.data?.error === 'actNotFound' && ++attempts <= 5) {
console.log("actNotFound - retrying...")
// Wait and retry.
await new Promise(resolve => setTimeout(resolve, 3000));
continue;
}
throw err;
}
}
}
await hostClient.disconnect();
}
}
async generateBetaHostAccount(rippledServer, governorAddress, domain, network = null) {
await setEvernodeDefaults(network, governorAddress, rippledServer);

View File

@@ -6,7 +6,7 @@
"": {
"name": "mb-xrpl",
"dependencies": {
"evernode-js-client": "0.6.21",
"evernode-js-client": "0.6.23",
"ip6addr": "0.2.5",
"sqlite3": "5.0.2"
},
@@ -980,9 +980,9 @@
}
},
"node_modules/evernode-js-client": {
"version": "0.6.21",
"resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.6.21.tgz",
"integrity": "sha512-Q5P6caMTzx3xaUNKhnP1vJTw3wTP/d2J2xSQEMn4m1+t/t67d8+eii3/FeQapRBSZEbNRHm9EbRry9PJhb9xcg==",
"version": "0.6.23",
"resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.6.23.tgz",
"integrity": "sha512-MXnQLkusq8UGDcf91bSmm9AVOQ3DSfSCJwWbuQpZDsXflbK5X6Ivxjj3ABQafGjAtQLn2KDKtlfzEwRzZvpkOQ==",
"dependencies": {
"elliptic": "6.5.4",
"libsodium-wrappers": "0.7.10",
@@ -4010,9 +4010,9 @@
"dev": true
},
"evernode-js-client": {
"version": "0.6.21",
"resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.6.21.tgz",
"integrity": "sha512-Q5P6caMTzx3xaUNKhnP1vJTw3wTP/d2J2xSQEMn4m1+t/t67d8+eii3/FeQapRBSZEbNRHm9EbRry9PJhb9xcg==",
"version": "0.6.23",
"resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.6.23.tgz",
"integrity": "sha512-MXnQLkusq8UGDcf91bSmm9AVOQ3DSfSCJwWbuQpZDsXflbK5X6Ivxjj3ABQafGjAtQLn2KDKtlfzEwRzZvpkOQ==",
"requires": {
"elliptic": "6.5.4",
"libsodium-wrappers": "0.7.10",

View File

@@ -5,7 +5,7 @@
"build": "npm run lint && ncc build app.js --minify -o dist"
},
"dependencies": {
"evernode-js-client": "0.6.21",
"evernode-js-client": "0.6.23",
"sqlite3": "5.0.2",
"ip6addr": "0.2.5"
},