diff --git a/CMakeLists.txt b/CMakeLists.txt index 004384d..dbbd089 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -70,7 +70,6 @@ add_custom_command(TARGET sagent POST_BUILD COMMAND mv ./build/bootstrap_contract ./build/contract_template/contract_fs/seed/state/ COMMAND ./installer/docker-install.sh ./build/dockerbin COMMAND npm --prefix ./mb-xrpl install && npm run --prefix ./mb-xrpl build - COMMAND npm --prefix ./governance-helper install && npm run --prefix ./governance-helper build ) target_precompile_headers(sagent PUBLIC src/pchheader.hpp) @@ -82,7 +81,6 @@ add_custom_target(installer COMMAND bash -c "cp -r ./installer/{docker-install.sh,docker-registry-install.sh,docker-registry-uninstall.sh,prereq.sh,sashimono-install.sh,sashimono-uninstall.sh} ./build/installer/" COMMAND bash -c "cp -r ./dependencies/{user-cgcreate.sh,libblake3.so,licence.txt} ./build/installer/" COMMAND bash -c "cp -r ./mb-xrpl/dist ./build/installer/mb-xrpl" - COMMAND bash -c "cp -r ./governance-helper/dist ./build/installer/governance-helper" COMMAND tar cfz ./build/installer.tar.gz --directory=./build/ installer COMMAND rm -r ./build/installer diff --git a/governance-helper/.gitignore b/governance-helper/.gitignore deleted file mode 100644 index 76add87..0000000 --- a/governance-helper/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -dist \ No newline at end of file diff --git a/governance-helper/index.js b/governance-helper/index.js deleted file mode 100644 index e624a5b..0000000 --- a/governance-helper/index.js +++ /dev/null @@ -1,74 +0,0 @@ -const evernode = require("evernode-js-client"); -const process = require("process"); -const fs = require("fs"); - -const DATA_DIR = process.env.DATA_DIR || __dirname; -const CONFIG_PATH = DATA_DIR + '/mb-xrpl.cfg'; -const SECRET_CONFIG_PATH = DATA_DIR + '/secret.cfg'; - -const getConfig = (skipSecret = false) => { - // Only root user can access the secret config. - if (!skipSecret) { - if (process.getuid() != 0) - throw `Please run with root privileges (sudo).`; - } - - if (!fs.existsSync(CONFIG_PATH)) - throw `Config file does not exist at ${CONFIG_PATH}`; - else if (!fs.existsSync(SECRET_CONFIG_PATH)) - throw `Config file does not exist at ${SECRET_CONFIG_PATH}`; - - let config = JSON.parse(fs.readFileSync(CONFIG_PATH).toString()); - const secretCfg = JSON.parse(fs.readFileSync(SECRET_CONFIG_PATH).toString()); - config.xrpl = { ...config.xrpl, ...secretCfg.xrpl }; - - return config; -} - -const propose = async (hashFilePath, shortName) => { - if (!hashFilePath) - throw `Hash file param cannot be empty.`; - else if (!fs.existsSync(hashFilePath)) - throw `Hash file ${hashFilePath} does not exist.`; - else if (!shortName) - throw `Short name cannot be empty.`; - - const hashes = fs.readFileSync(hashFilePath).toString(); - - const config = getConfig(); - - const xrplApi = new evernode.XrplApi(config.xrpl.rippledServer); - evernode.Defaults.set({ - governorAddress: config.xrpl.governorAddress, - xrplApi: xrplApi - }) - await xrplApi.connect(); - const hostClient = new evernode.HostClient(config.xrpl.address, config.xrpl.secret); - - try { - await hostClient.connect(); - await hostClient.propose(hashes, shortName); - } finally { - await hostClient.disconnect(); - await xrplApi.disconnect(); - } -} - -const app = async () => { - const command = process.argv[2]; - const params = process.argv.slice(3); - - if (command == "propose" && params.length == 2) - await propose(params[0], params[1]); - else { - console.error("Supported governance commands:\n propose - Propose new hook candidate"); - process.exit(2); - } -} - -app().then(() => { - process.exit(0); -}).catch((e) => { - console.error(e); - process.exit(1); -}); \ No newline at end of file diff --git a/governance-helper/package-lock.json b/governance-helper/package-lock.json deleted file mode 100644 index b433b17..0000000 --- a/governance-helper/package-lock.json +++ /dev/null @@ -1,1585 +0,0 @@ -{ - "name": "governance-helper", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "governance-helper", - "dependencies": { - "evernode-js-client": "0.5.16" - } - }, - "node_modules/@types/node": { - "version": "10.12.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", - "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==" - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/assert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", - "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", - "dependencies": { - "es6-object-assign": "^1.1.0", - "is-nan": "^1.2.1", - "object-is": "^1.0.1", - "util": "^0.12.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/bignumber.js": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", - "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", - "engines": { - "node": "*" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bip32": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/bip32/-/bip32-2.0.6.tgz", - "integrity": "sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA==", - "dependencies": { - "@types/node": "10.12.18", - "bs58check": "^2.1.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "tiny-secp256k1": "^1.1.3", - "typeforce": "^1.11.5", - "wif": "^2.0.6" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/bip39": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz", - "integrity": "sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==", - "dependencies": { - "@types/node": "11.11.6", - "create-hash": "^1.1.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1" - } - }, - "node_modules/bip39/node_modules/@types/node": { - "version": "11.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", - "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==" - }, - "node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" - }, - "node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "dependencies": { - "base-x": "^3.0.2" - } - }, - "node_modules/bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "dependencies": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" - }, - "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/es6-object-assign": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==" - }, - "node_modules/evernode-js-client": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.5.16.tgz", - "integrity": "sha512-DZxbbc+RPnQXLYlipNIYcZUndOgIfEW4f+fB1cNA5ImAQL6mCeE2cpWrz6GULfOS8X99A2Fcxy7X7ny66QfT9g==", - "dependencies": { - "elliptic": "6.5.4", - "libsodium-wrappers": "0.7.10", - "ripple-address-codec": "4.2.0", - "ripple-keypairs": "1.1.0", - "xrpl": "2.2.1", - "xrpl-binary-codec": "1.4.2" - } - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/libsodium": { - "version": "0.7.10", - "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.10.tgz", - "integrity": "sha512-eY+z7hDrDKxkAK+QKZVNv92A5KYkxfvIshtBJkmg5TSiCnYqZP3i9OO9whE79Pwgm4jGaoHgkM4ao/b9Cyu4zQ==" - }, - "node_modules/libsodium-wrappers": { - "version": "0.7.10", - "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.10.tgz", - "integrity": "sha512-pO3F1Q9NPLB/MWIhehim42b/Fwb30JNScCNh8TcQ/kIc+qGLQch8ag8wb0keK3EP5kbGakk1H8Wwo7v+36rNQg==", - "dependencies": { - "libsodium": "^0.7.0" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" - }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/ripple-address-codec": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-4.2.0.tgz", - "integrity": "sha512-9QhBNDiWjwj7l+WQ7H7klXF/VwxVj2Q0HRhd4vLCueTPoxUtaNQyfvUZFiXJrqxg0heM3/iWxupkq4TwrXgSuQ==", - "dependencies": { - "base-x": "3.0.9", - "create-hash": "^1.1.2" - }, - "engines": { - "node": ">= 10", - "npm": ">=7.0.0" - } - }, - "node_modules/ripple-binary-codec": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-1.4.2.tgz", - "integrity": "sha512-EDKIyZMa/6Ay/oNgCwjD9b9CJv0zmBreeHVQeG4BYwy+9GPnIQjNeT5e/aB6OjAnhcmpgbPeBmzwmNVwzxlt0w==", - "dependencies": { - "assert": "^2.0.0", - "big-integer": "^1.6.48", - "buffer": "5.6.0", - "create-hash": "^1.2.0", - "decimal.js": "^10.2.0", - "ripple-address-codec": "^4.2.4" - }, - "engines": { - "node": ">=10.22.0" - } - }, - "node_modules/ripple-binary-codec/node_modules/ripple-address-codec": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-4.2.4.tgz", - "integrity": "sha512-roAOjKz94+FboTItey1XRh5qynwt4xvfBLvbbcx+FiR94Yw2x3LrKLF2GVCMCSAh5I6PkcpADg6AbYsUbGN3nA==", - "dependencies": { - "base-x": "3.0.9", - "create-hash": "^1.1.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/ripple-keypairs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-1.1.0.tgz", - "integrity": "sha512-Zlmbtn2YUpW4uKlLm2/tpkY5RC/EXQlkJwIIKp0AoF9D23pJ43/EuipNW2F6qURdbkUezDwB0bMV7uRXip3x2w==", - "dependencies": { - "bn.js": "^5.1.1", - "brorand": "^1.0.5", - "elliptic": "^6.5.4", - "hash.js": "^1.0.3", - "ripple-address-codec": "^4.2.0" - }, - "engines": { - "node": ">= 10", - "npm": ">=7.0.0" - } - }, - "node_modules/ripple-keypairs/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/tiny-secp256k1": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz", - "integrity": "sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA==", - "hasInstallScript": true, - "dependencies": { - "bindings": "^1.3.0", - "bn.js": "^4.11.8", - "create-hmac": "^1.1.7", - "elliptic": "^6.4.0", - "nan": "^2.13.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/typeforce": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", - "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==" - }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wif": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", - "integrity": "sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ==", - "dependencies": { - "bs58check": "<3.0.0" - } - }, - "node_modules/ws": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", - "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xrpl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/xrpl/-/xrpl-2.2.1.tgz", - "integrity": "sha512-UlUtV0SAaXxdAAZYluU+pEg9WmDrvEcHZYL0KR2bQS6xu2mMlQvXorkCAiS8cLI+PQR0i8CGJDReRV5kjGg1pA==", - "dependencies": { - "bignumber.js": "^9.0.0", - "bip32": "^2.0.6", - "bip39": "^3.0.4", - "https-proxy-agent": "^5.0.0", - "lodash": "^4.17.4", - "ripple-address-codec": "^4.2.4", - "ripple-binary-codec": "^1.4.0", - "ripple-keypairs": "^1.1.3", - "ws": "^8.2.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/xrpl-binary-codec": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/xrpl-binary-codec/-/xrpl-binary-codec-1.4.2.tgz", - "integrity": "sha512-fYyyaiVgeCGUEplqebWl272NxOixLjb0xAIGjNUT17HytECPbUlc/0xUr9PvGLriqpZtQ3YEgpwpCPTEpFvL4A==", - "dependencies": { - "assert": "^2.0.0", - "big-integer": "^1.6.48", - "buffer": "5.6.0", - "create-hash": "^1.2.0", - "decimal.js": "^10.2.0", - "ripple-address-codec": "^4.2.3" - }, - "engines": { - "node": ">=10.22.0" - } - }, - "node_modules/xrpl-binary-codec/node_modules/ripple-address-codec": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-4.2.4.tgz", - "integrity": "sha512-roAOjKz94+FboTItey1XRh5qynwt4xvfBLvbbcx+FiR94Yw2x3LrKLF2GVCMCSAh5I6PkcpADg6AbYsUbGN3nA==", - "dependencies": { - "base-x": "3.0.9", - "create-hash": "^1.1.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/xrpl/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/xrpl/node_modules/ripple-address-codec": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-4.2.4.tgz", - "integrity": "sha512-roAOjKz94+FboTItey1XRh5qynwt4xvfBLvbbcx+FiR94Yw2x3LrKLF2GVCMCSAh5I6PkcpADg6AbYsUbGN3nA==", - "dependencies": { - "base-x": "3.0.9", - "create-hash": "^1.1.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/xrpl/node_modules/ripple-keypairs": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-1.1.4.tgz", - "integrity": "sha512-PMMjTOxZmCSBOvHPj6bA+V/HGx7oFgDtGGI8VcZYuaFO2H87UX0X0jhfHy+LA2Xy31WYlD7GaDIDDt2QO+AMtw==", - "dependencies": { - "bn.js": "^5.1.1", - "brorand": "^1.0.5", - "elliptic": "^6.5.4", - "hash.js": "^1.0.3", - "ripple-address-codec": "^4.2.4" - }, - "engines": { - "node": ">= 10" - } - } - }, - "dependencies": { - "@types/node": { - "version": "10.12.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", - "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==" - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "requires": { - "debug": "4" - } - }, - "assert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", - "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", - "requires": { - "es6-object-assign": "^1.1.0", - "is-nan": "^1.2.1", - "object-is": "^1.0.1", - "util": "^0.12.0" - } - }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" - }, - "base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" - }, - "bignumber.js": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", - "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==" - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bip32": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/bip32/-/bip32-2.0.6.tgz", - "integrity": "sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA==", - "requires": { - "@types/node": "10.12.18", - "bs58check": "^2.1.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "tiny-secp256k1": "^1.1.3", - "typeforce": "^1.11.5", - "wif": "^2.0.6" - } - }, - "bip39": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz", - "integrity": "sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==", - "requires": { - "@types/node": "11.11.6", - "create-hash": "^1.1.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1" - }, - "dependencies": { - "@types/node": { - "version": "11.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", - "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==" - } - } - }, - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" - }, - "bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "requires": { - "base-x": "^3.0.2" - } - }, - "bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "requires": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "es6-object-assign": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==" - }, - "evernode-js-client": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.5.16.tgz", - "integrity": "sha512-DZxbbc+RPnQXLYlipNIYcZUndOgIfEW4f+fB1cNA5ImAQL6mCeE2cpWrz6GULfOS8X99A2Fcxy7X7ny66QfT9g==", - "requires": { - "elliptic": "6.5.4", - "libsodium-wrappers": "0.7.10", - "ripple-address-codec": "4.2.0", - "ripple-keypairs": "1.1.0", - "xrpl": "2.2.1", - "xrpl-binary-codec": "1.4.2" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "requires": { - "is-callable": "^1.1.3" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "requires": { - "has-symbols": "^1.0.2" - } - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" - }, - "is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - } - }, - "libsodium": { - "version": "0.7.10", - "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.10.tgz", - "integrity": "sha512-eY+z7hDrDKxkAK+QKZVNv92A5KYkxfvIshtBJkmg5TSiCnYqZP3i9OO9whE79Pwgm4jGaoHgkM4ao/b9Cyu4zQ==" - }, - "libsodium-wrappers": { - "version": "0.7.10", - "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.10.tgz", - "integrity": "sha512-pO3F1Q9NPLB/MWIhehim42b/Fwb30JNScCNh8TcQ/kIc+qGLQch8ag8wb0keK3EP5kbGakk1H8Wwo7v+36rNQg==", - "requires": { - "libsodium": "^0.7.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" - }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "ripple-address-codec": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-4.2.0.tgz", - "integrity": "sha512-9QhBNDiWjwj7l+WQ7H7klXF/VwxVj2Q0HRhd4vLCueTPoxUtaNQyfvUZFiXJrqxg0heM3/iWxupkq4TwrXgSuQ==", - "requires": { - "base-x": "3.0.9", - "create-hash": "^1.1.2" - } - }, - "ripple-binary-codec": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-1.4.2.tgz", - "integrity": "sha512-EDKIyZMa/6Ay/oNgCwjD9b9CJv0zmBreeHVQeG4BYwy+9GPnIQjNeT5e/aB6OjAnhcmpgbPeBmzwmNVwzxlt0w==", - "requires": { - "assert": "^2.0.0", - "big-integer": "^1.6.48", - "buffer": "5.6.0", - "create-hash": "^1.2.0", - "decimal.js": "^10.2.0", - "ripple-address-codec": "^4.2.4" - }, - "dependencies": { - "ripple-address-codec": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-4.2.4.tgz", - "integrity": "sha512-roAOjKz94+FboTItey1XRh5qynwt4xvfBLvbbcx+FiR94Yw2x3LrKLF2GVCMCSAh5I6PkcpADg6AbYsUbGN3nA==", - "requires": { - "base-x": "3.0.9", - "create-hash": "^1.1.2" - } - } - } - }, - "ripple-keypairs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-1.1.0.tgz", - "integrity": "sha512-Zlmbtn2YUpW4uKlLm2/tpkY5RC/EXQlkJwIIKp0AoF9D23pJ43/EuipNW2F6qURdbkUezDwB0bMV7uRXip3x2w==", - "requires": { - "bn.js": "^5.1.1", - "brorand": "^1.0.5", - "elliptic": "^6.5.4", - "hash.js": "^1.0.3", - "ripple-address-codec": "^4.2.0" - }, - "dependencies": { - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - } - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "tiny-secp256k1": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz", - "integrity": "sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA==", - "requires": { - "bindings": "^1.3.0", - "bn.js": "^4.11.8", - "create-hmac": "^1.1.7", - "elliptic": "^6.4.0", - "nan": "^2.13.2" - } - }, - "typeforce": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", - "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==" - }, - "util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "requires": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - } - }, - "wif": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", - "integrity": "sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ==", - "requires": { - "bs58check": "<3.0.0" - } - }, - "ws": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", - "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", - "requires": {} - }, - "xrpl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/xrpl/-/xrpl-2.2.1.tgz", - "integrity": "sha512-UlUtV0SAaXxdAAZYluU+pEg9WmDrvEcHZYL0KR2bQS6xu2mMlQvXorkCAiS8cLI+PQR0i8CGJDReRV5kjGg1pA==", - "requires": { - "bignumber.js": "^9.0.0", - "bip32": "^2.0.6", - "bip39": "^3.0.4", - "https-proxy-agent": "^5.0.0", - "lodash": "^4.17.4", - "ripple-address-codec": "^4.2.4", - "ripple-binary-codec": "^1.4.0", - "ripple-keypairs": "^1.1.3", - "ws": "^8.2.2" - }, - "dependencies": { - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "ripple-address-codec": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-4.2.4.tgz", - "integrity": "sha512-roAOjKz94+FboTItey1XRh5qynwt4xvfBLvbbcx+FiR94Yw2x3LrKLF2GVCMCSAh5I6PkcpADg6AbYsUbGN3nA==", - "requires": { - "base-x": "3.0.9", - "create-hash": "^1.1.2" - } - }, - "ripple-keypairs": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-1.1.4.tgz", - "integrity": "sha512-PMMjTOxZmCSBOvHPj6bA+V/HGx7oFgDtGGI8VcZYuaFO2H87UX0X0jhfHy+LA2Xy31WYlD7GaDIDDt2QO+AMtw==", - "requires": { - "bn.js": "^5.1.1", - "brorand": "^1.0.5", - "elliptic": "^6.5.4", - "hash.js": "^1.0.3", - "ripple-address-codec": "^4.2.4" - } - } - } - }, - "xrpl-binary-codec": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/xrpl-binary-codec/-/xrpl-binary-codec-1.4.2.tgz", - "integrity": "sha512-fYyyaiVgeCGUEplqebWl272NxOixLjb0xAIGjNUT17HytECPbUlc/0xUr9PvGLriqpZtQ3YEgpwpCPTEpFvL4A==", - "requires": { - "assert": "^2.0.0", - "big-integer": "^1.6.48", - "buffer": "5.6.0", - "create-hash": "^1.2.0", - "decimal.js": "^10.2.0", - "ripple-address-codec": "^4.2.3" - }, - "dependencies": { - "ripple-address-codec": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-4.2.4.tgz", - "integrity": "sha512-roAOjKz94+FboTItey1XRh5qynwt4xvfBLvbbcx+FiR94Yw2x3LrKLF2GVCMCSAh5I6PkcpADg6AbYsUbGN3nA==", - "requires": { - "base-x": "3.0.9", - "create-hash": "^1.1.2" - } - } - } - } - } -} diff --git a/governance-helper/package.json b/governance-helper/package.json deleted file mode 100644 index fed6f85..0000000 --- a/governance-helper/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "governance-helper", - "scripts": { - "build": "ncc build index.js --minify -o dist" - }, - "dependencies": { - "evernode-js-client": "0.5.17" - } -} diff --git a/installer/jshelper/package-lock.json b/installer/jshelper/package-lock.json index cd68a3c..fee34c1 100644 --- a/installer/jshelper/package-lock.json +++ b/installer/jshelper/package-lock.json @@ -6,7 +6,7 @@ "": { "name": "evernode-setup-helper", "dependencies": { - "evernode-js-client": "0.5.16" + "evernode-js-client": "0.5.17-beta-v3.0" } }, "node_modules/@types/node": { @@ -270,9 +270,10 @@ "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==" }, "node_modules/evernode-js-client": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.5.16.tgz", - "integrity": "sha512-DZxbbc+RPnQXLYlipNIYcZUndOgIfEW4f+fB1cNA5ImAQL6mCeE2cpWrz6GULfOS8X99A2Fcxy7X7ny66QfT9g==", + "version": "0.5.17-beta-v3.0", + "resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.5.17-beta-v3.0.tgz", + "integrity": "sha512-7FYBqh99uwOKBCABmSDDQF1VZHknU9sqOSAT/T68M3NsU7F+QrC6vFvHLvghPZJ83g6eyzqipZRIuHflRHLmtw==", + "hasInstallScript": true, "dependencies": { "elliptic": "6.5.4", "libsodium-wrappers": "0.7.10", @@ -1109,9 +1110,9 @@ "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==" }, "evernode-js-client": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.5.16.tgz", - "integrity": "sha512-DZxbbc+RPnQXLYlipNIYcZUndOgIfEW4f+fB1cNA5ImAQL6mCeE2cpWrz6GULfOS8X99A2Fcxy7X7ny66QfT9g==", + "version": "0.5.17-beta-v3.0", + "resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.5.17-beta-v3.0.tgz", + "integrity": "sha512-7FYBqh99uwOKBCABmSDDQF1VZHknU9sqOSAT/T68M3NsU7F+QrC6vFvHLvghPZJ83g6eyzqipZRIuHflRHLmtw==", "requires": { "elliptic": "6.5.4", "libsodium-wrappers": "0.7.10", diff --git a/installer/jshelper/package.json b/installer/jshelper/package.json index 7a966f9..902803f 100644 --- a/installer/jshelper/package.json +++ b/installer/jshelper/package.json @@ -4,6 +4,6 @@ "build": "ncc build index.js --minify -o dist" }, "dependencies": { - "evernode-js-client": "0.5.17" + "evernode-js-client": "0.5.17-beta-v3.0" } } diff --git a/installer/sashimono-install.sh b/installer/sashimono-install.sh index 5856846..7fc92d9 100755 --- a/installer/sashimono-install.sh +++ b/installer/sashimono-install.sh @@ -227,7 +227,7 @@ if [ "$NO_MB" == "" ]; then # Configure message board users and register host. echo "Configuaring host registration on Evernode..." - cp -r "$script_dir"/{mb-xrpl,governance-helper} $SASHIMONO_BIN + cp -r "$script_dir"/mb-xrpl $SASHIMONO_BIN # Creating message board user (if not exists). if ! grep -q "^$MB_XRPL_USER:" /etc/passwd; then diff --git a/installer/setup.sh b/installer/setup.sh index 1dd0b34..2ed0da0 100755 --- a/installer/setup.sh +++ b/installer/setup.sh @@ -32,7 +32,6 @@ export USER_BIN=/usr/bin export SASHIMONO_BIN=/usr/bin/sashimono export MB_XRPL_BIN=$SASHIMONO_BIN/mb-xrpl export DOCKER_BIN=$SASHIMONO_BIN/dockerbin -export GOVERNANCE_HELPER_BIN=$SASHIMONO_BIN/governance-helper export SASHIMONO_DATA=/etc/sashimono export MB_XRPL_DATA=$SASHIMONO_DATA/mb-xrpl export SASHIMONO_SERVICE="sashimono-agent" @@ -90,26 +89,21 @@ if [ -f /etc/systemd/system/$SASHIMONO_SERVICE.service ] && [ -d $SASHIMONO_BIN && echo "$evernode is already installed on your host. Use the 'evernode' command to manage your host." \ && exit 1 - if ([ "$1" != "uninstall" ] && [ "$1" != "status" ] && [ "$1" != "list" ] && [ "$1" != "update" ] && - [ "$1" != "log" ] && [ "$1" != "applyssl" ] && [ "$1" != "transfer" ] && [ "$1" != "config" ] && [ "$1" != "delete" ]); then - - output=$(DATA_DIR=$MB_XRPL_DATA /usr/bin/node $GOVERNANCE_HELPER_BIN "$@" 2>&1) - exit_code=$? - [ $exit_code -eq 2 ] && echomult "$evernode host management tool + [ "$1" != "uninstall" ] && [ "$1" != "status" ] && [ "$1" != "list" ] && [ "$1" != "update" ] && [ "$1" != "log" ] && [ "$1" != "applyssl" ] && [ "$1" != "transfer" ] && [ "$1" != "config" ] && [ "$1" != "delete" ] && [ "$1" != "governance" ] \ + && echomult "$evernode host management tool \nYour host is registered on $evernode. \nSupported commands: - \n status - View $evernode registration info - \n list - View contract instances running on this system - \n log - Generate evernode log file. - \n applyssl - Apply new SSL certificates for contracts. - \n config - View and update host configuration. - \n update - Check and install $evernode software updates - \n transfer - Initiate an $evernode transfer for your machine - \n delete - Remove an instance from the system and recreate the lease - \n uninstall - Uninstall and deregister from $evernode" - echo "$output" - [ ! $exit_code -eq 0 ] && exit 1 - fi + \nstatus - View $evernode registration info + \nlist - View contract instances running on this system + \nlog - Generate evernode log file. + \napplyssl - Apply new SSL certificates for contracts. + \nconfig - View and update host configuration. + \nupdate - Check and install $evernode software updates + \ntransfer - Initiate an $evernode transfer for your machine + \ndelete - Remove an instance from the system and recreate the lease + \nuninstall - Uninstall and deregister from $evernode + \ngovernance - Governance candidate management" \ + && exit 1 elif [ -d $SASHIMONO_BIN ] ; then [ "$1" != "install" ] && [ "$1" != "uninstall" ] \ && echomult "$evernode host management tool @@ -1190,6 +1184,17 @@ elif [ "$mode" == "delete" ]; then delete_instance "$2" +elif [ "$mode" == "governance" ]; then + [ $2 == "help" ] && echomult "Governance management tool + \nSupported commands: + \npropose [hashFile] [shortName] - Propose new governance candidate. + \nwithdraw [candidateId] - Withdraw proposed governance candidate. + \nvote [candidateId] - Vote for a governance candidate. + \nunvote [candidateId] - Remove vote from voted governance candidate. + \nstatus - Get governance info of this host. + \nhelp - Print help." && exit 0 + ! MB_DATA_DIR=$MB_XRPL_DATA node $MB_XRPL_BIN ${*:1} && exit 1 + fi [ "$mode" != "uninstall" ] && check_installer_pending_finish diff --git a/mb-xrpl/.gitignore b/mb-xrpl/.gitignore index 12fcbe1..2978b62 100644 --- a/mb-xrpl/.gitignore +++ b/mb-xrpl/.gitignore @@ -3,4 +3,5 @@ dist log mb-xrpl.cfg secret.cfg +governance.cfg mb-xrpl.sqlite \ No newline at end of file diff --git a/mb-xrpl/app.js b/mb-xrpl/app.js index 2776ed5..9210592 100644 --- a/mb-xrpl/app.js +++ b/mb-xrpl/app.js @@ -3,6 +3,7 @@ const logger = require('./lib/logger'); const { appenv } = require('./lib/appenv'); const { Setup } = require('./lib/setup'); const { MessageBoard } = require('./lib/message-board'); +const { GovernanceManager } = require('./lib/governance-manager'); async function main() { @@ -20,9 +21,8 @@ async function main() { const leaseAmount = process.argv[7]; const rippledServer = process.argv[8]; const setup = new Setup(); - const secondaryAddrsCfg = {}; - const acc = await setup.setupHostAccount(accountAddress, accountSecret, rippledServer, governorAddress, domain, secondaryAddrsCfg); - setup.newConfig(acc.address, acc.secret, governorAddress, parseFloat(leaseAmount), secondaryAddrsCfg, rippledServer); + const acc = await setup.setupHostAccount(accountAddress, accountSecret, rippledServer, governorAddress, domain); + setup.newConfig(acc.address, acc.secret, governorAddress, parseFloat(leaseAmount), rippledServer); } else if (process.argv.length === 7 && process.argv[2] === 'betagen') { const governorAddress = process.argv[3]; @@ -30,9 +30,8 @@ async function main() { const leaseAmount = process.argv[5]; const rippledServer = process.argv[6]; const setup = new Setup(); - const secondaryAddrsCfg = {}; - const acc = await setup.generateBetaHostAccount(rippledServer, governorAddress, domain, secondaryAddrsCfg); - setup.newConfig(acc.address, acc.secret, governorAddress, parseFloat(leaseAmount), secondaryAddrsCfg, rippledServer); + const acc = await setup.generateBetaHostAccount(rippledServer, governorAddress, domain); + setup.newConfig(acc.address, acc.secret, governorAddress, parseFloat(leaseAmount), rippledServer); } else if (process.argv.length === 13 && process.argv[2] === 'register') { await new Setup().register(process.argv[3], parseInt(process.argv[4]), parseInt(process.argv[5]), @@ -59,6 +58,9 @@ async function main() { else if (process.argv.length === 4 && process.argv[2] === 'delete') { await new Setup().deleteInstance(process.argv[3]); } + else if (process.argv.length >= 4 && process.argv[2] === 'governance') { + await GovernanceManager.handleCommand(process.argv[3], ...process.argv.slice(4)); + } else if (process.argv[2] === 'help') { console.log(`Usage: node index.js - Run message board. @@ -72,6 +74,7 @@ async function main() { node index.js upgrade [governorAddress] - Upgrade message board data. node index.js reconfig [leaseAmount] [totalInstanceCount] [rippledServer] - Update message board configuration. node index.js delete [containerName] - Delete an instance and recreate the lease offer + node index.js governance [command] [args] - Governance handling. node index.js help - Print help.`); } else { diff --git a/mb-xrpl/lib/appenv.js b/mb-xrpl/lib/appenv.js index f01154e..c53799a 100644 --- a/mb-xrpl/lib/appenv.js +++ b/mb-xrpl/lib/appenv.js @@ -14,6 +14,7 @@ appenv = { ...appenv, CONFIG_PATH: appenv.DATA_DIR + '/mb-xrpl.cfg', SECRET_CONFIG_PATH: appenv.DATA_DIR + '/secret.cfg', + GOVERNANCE_CONFIG_PATH: appenv.DATA_DIR + '/governance.cfg', LOG_PATH: appenv.DATA_DIR + '/log/mb-xrpl.log', DB_PATH: appenv.DATA_DIR + '/mb-xrpl.sqlite', DB_TABLE_NAME: 'leases', diff --git a/mb-xrpl/lib/governance-manager.js b/mb-xrpl/lib/governance-manager.js new file mode 100644 index 0000000..8d69ee1 --- /dev/null +++ b/mb-xrpl/lib/governance-manager.js @@ -0,0 +1,181 @@ + +const evernode = require('evernode-js-client'); +const fs = require('fs'); +const { appenv } = require('./appenv'); +const { ConfigHelper } = require('./config-helper'); + +function setEvernodeDefaults(governorAddress, rippledServer, xrplApi) { + evernode.Defaults.set({ + governorAddress: governorAddress, + rippledServer: rippledServer, + xrplApi: xrplApi + }); +} + +class GovernanceManager { + #cfgPath; + + constructor(cfgPath) { + this.#cfgPath = cfgPath; + if (!fs.existsSync(cfgPath)) { + this.#writeConfig({ + votes: {} + }); + } + } + + #writeConfig(cfg) { + fs.writeFileSync(this.#cfgPath, JSON.stringify(cfg, null, 2), { mode: 0o644 }); // Set file permission so only current user can read/write and others can read. + } + + async proposeCandidate(hashFilePath, shortName, hostClient) { + if (!hashFilePath) + throw `Hash file param cannot be empty.`; + else if (!fs.existsSync(hashFilePath)) + throw `Hash file ${hashFilePath} does not exist.`; + else if (!shortName) + throw `Short name cannot be empty.`; + + const hashes = fs.readFileSync(hashFilePath).toString(); + + let candidateId = null; + try { + await hostClient.connect(); + candidateId = await hostClient.propose(hashes, shortName).catch(e => { + let err; + if (e.code === "tecHOOK_REJECTED" && e.hookExecutionResult) { + err = e.hookExecutionResult.map(o => o.message).join(', '); + } + throw err || e.code || 'PROPOSE_TX_ERR'; + }); + } finally { + await hostClient.disconnect(); + } + return candidateId; + } + + async withdrawCandidate(candidateId, hostClient) { + if (!candidateId) + throw `Candidate id cannot be empty.`; + + try { + await hostClient.connect(); + + const candidate = await hostClient.getCandidateById(candidateId); + if (!candidate) + throw `There's no governance candidate for the given candidate id.`; + else if (candidate.ownerAddress !== hostClient.xrplAcc.address) + throw `Trying to remove governance candidate which is not owned by host.`; + + await hostClient.withdraw(candidateId).catch(e => { + let err; + if (e.code === "tecHOOK_REJECTED" && e.hookExecutionResult) { + err = e.hookExecutionResult.map(o => o.message).join(', '); + } + throw err || e.code || 'WITHDRAW_TX_ERR'; + }); + } finally { + await hostClient.disconnect(); + } + } + + async voteCandidate(candidateId, hostClient) { + try { + await hostClient.connect(); + + const candidate = await hostClient.getCandidateById(candidateId); + if (!candidate) + throw `There's no governance candidate for the given candidate id.`; + + let cfg = this.getConfig(); + cfg.votes[candidateId] = evernode.EvernodeConstants.CandidateVote.Support; + this.#writeConfig(cfg); + } finally { + await hostClient.disconnect(); + } + } + + clearCandidate(candidateId) { + let cfg = this.getConfig(); + delete cfg.votes[candidateId]; + this.#writeConfig(cfg); + } + + unvoteCandidate(candidateId) { + let cfg = this.getConfig(); + cfg.votes[candidateId] = evernode.EvernodeConstants.CandidateVote.Reject; + this.#writeConfig(cfg); + } + + getVotes() { + const cfg = this.getConfig(); + return cfg?.votes; + } + + async getStatus(hostClient) { + let status = this.getConfig(); + try { + await hostClient.connect(); + const candidate = await hostClient.getCandidateByOwner(); + + if (candidate) + status = { ...status, candidate: candidate.uniqueId }; + } finally { + await hostClient.disconnect(); + } + + return status; + } + + getConfig() { + return JSON.parse(fs.readFileSync(this.#cfgPath).toString()); + } + + static async handleCommand(command, ...args) { + let hostClient = null; + + // Secret is needed for propose and withdraw in order to send the transaction. + // Root access is needed in order to access the secret config. + // Vote and unvote need write access for the governance config. + if ((command == 'propose' || command === 'withdraw' || command === 'vote' || command === 'unvote') && process.getuid() !== 0) + throw "Please run with root privileges (sudo)."; + + // Host client is only needed for some commands. + if (command == 'propose' || command === 'withdraw' || command === 'vote' || command === 'status') { + // Secret is needed for propose and withdraw in order to send the transaction + const sashiMBConfig = ConfigHelper.readConfig(appenv.CONFIG_PATH, + (command == 'propose' || command === 'withdraw') ? appenv.SECRET_CONFIG_PATH : null); + setEvernodeDefaults(sashiMBConfig.xrpl.governorAddress, sashiMBConfig.xrpl.rippledServer); + hostClient = new evernode.HostClient(sashiMBConfig.xrpl.address, sashiMBConfig.xrpl.secret); + } + const mgr = new GovernanceManager(appenv.GOVERNANCE_CONFIG_PATH); + + if (args.length === 2 && command === 'propose') { + const id = await mgr.proposeCandidate(args[0], args[1], hostClient); + console.log(`Successfully proposed the candidate ${id}.`); + } + else if (args.length === 1 && command === 'withdraw') { + await mgr.withdrawCandidate(args[0], hostClient); + console.log(`Successfully withdrawn the candidate ${args[0]}.`); + } + else if (args.length === 1 && command === 'vote') { + await mgr.voteCandidate(args[0], hostClient); + console.log(`Voted for candidate ${args[0]}.`); + } + else if (args.length === 1 && command === 'unvote') { + mgr.clearCandidate(args[0]); + console.log(`Rejected vote for candidate ${args[0]}.`); + } + else if (args.length === 0 && command === 'status') { + const status = await mgr.getStatus(hostClient); + console.log(JSON.stringify(status, null, 2)); + } + else { + throw "Invalid args."; + } + } +} + +module.exports = { + GovernanceManager +} \ No newline at end of file diff --git a/mb-xrpl/lib/message-board.js b/mb-xrpl/lib/message-board.js index cbd77cb..daa0ad4 100644 --- a/mb-xrpl/lib/message-board.js +++ b/mb-xrpl/lib/message-board.js @@ -4,6 +4,7 @@ const { SqliteDatabase, DataTypes } = require('./sqlite-handler'); const { appenv } = require('./appenv'); const { SashiCLI } = require('./sashi-cli'); const { ConfigHelper } = require('./config-helper'); +const { GovernanceManager } = require('./governance-manager'); const LeaseStatus = { ACQUIRING: 'Acquiring', @@ -39,19 +40,14 @@ class MessageBoard { this.sashiDb = new SqliteDatabase(sashiDbPath); this.sashiTable = appenv.SASHI_TABLE_NAME; this.sashiConfigPath = sashiConfigPath; + this.governanceManager = new GovernanceManager(appenv.GOVERNANCE_CONFIG_PATH); } async init() { this.readConfig(); - if (!this.cfg.version || !this.cfg.xrpl.address || !this.cfg.xrpl.secret || !this.cfg.xrpl.governorAddress || !this.cfg.xrpl.registryAddress || - !this.cfg.xrpl.heartbeatAddress) + if (!this.cfg.version || !this.cfg.xrpl.address || !this.cfg.xrpl.secret || !this.cfg.xrpl.governorAddress) throw "Required cfg fields cannot be empty."; - console.log("Using,\n\tGovernor account " + this.cfg.xrpl.governorAddress); - console.log("\tRegistry account " + this.cfg.xrpl.registryAddress); - console.log("\tHeartbeat account " + this.cfg.xrpl.heartbeatAddress); - console.log("Using rippled " + this.cfg.xrpl.rippledServer); - this.xrplApi = new evernode.XrplApi(this.cfg.xrpl.rippledServer); evernode.Defaults.set({ governorAddress: this.cfg.xrpl.governorAddress, @@ -61,6 +57,13 @@ class MessageBoard { this.hostClient = new evernode.HostClient(this.cfg.xrpl.address, this.cfg.xrpl.secret); await this.#connectHost(); + + console.log("Using,"); + console.log("\tGovernor account " + this.cfg.xrpl.governorAddress); + console.log("\tRegistry account " + this.hostClient.config.registryAddress); + console.log("\tHeartbeat account " + this.hostClient.config.heartbeatAddress); + console.log("Using rippled " + this.cfg.xrpl.rippledServer); + // Get last heartbeat moment from the host info. let hostInfo = await this.hostClient.getRegistration(); if (!hostInfo) @@ -211,6 +214,47 @@ class MessageBoard { ongoingHeartbeat = true; console.log(`Reporting heartbeat at Moment ${currentMoment}...`); + // Send heartbeat with votes, if there are votes in the config. + let heartbeatSent = false; + const votes = this.governanceManager.getVotes(); + if (votes) { + const voteArr = (await Promise.all(Object.entries(votes).map(async ([key, value]) => { + const candidate = await this.hostClient.getCandidateById(key); + // Delete candidate vote if there's no such candidate. + if (!candidate) { + this.governanceManager.clearCandidate(key); + return null; + } + return { + candidate: candidate.uniqueId, + vote: value === evernode.EvernodeConstants.CandidateVote.Support ? + evernode.EvernodeConstants.CandidateVote.Support : + evernode.EvernodeConstants.CandidateVote.Reject, + idx: candidate.index + }; + }))).filter(v => v).sort((a, b) => a.idx - b.idx); + if (voteArr && voteArr.length) { + for (const vote of voteArr) { + try { + await this.hostClient.heartbeat(vote); + heartbeatSent = true; + } + catch (e) { + // Remove candidate from config in vote validation from the hook failed. + if (e.code === 'VOTE_VALIDATION_ERR') { + console.error(e.error); + this.governanceManager.clearCandidate(vote.candidate); + } + throw e; + } + } + } + } + + // Return if at-least one heartbeat has been sent. Otherwise send heartbeat without votes. + if (heartbeatSent) + return; + try { await this.hostClient.heartbeat(); this.lastHeartbeatMoment = currentMoment; diff --git a/mb-xrpl/lib/setup.js b/mb-xrpl/lib/setup.js index 021559a..d35e0f7 100644 --- a/mb-xrpl/lib/setup.js +++ b/mb-xrpl/lib/setup.js @@ -56,21 +56,20 @@ class Setup { ConfigHelper.writeConfig(cfg, appenv.CONFIG_PATH, appenv.SECRET_CONFIG_PATH); } - newConfig(address = "", secret = "", governorAddress = "", leaseAmount = 0, secondaryAddrsCfg = { registryAddress: "", heartbeatAddress: "" }, rippledServer = null) { + newConfig(address = "", secret = "", governorAddress = "", leaseAmount = 0, rippledServer = null) { this.#saveConfig({ version: appenv.MB_VERSION, xrpl: { address: address, secret: secret, governorAddress: governorAddress, - ...secondaryAddrsCfg, rippledServer: rippledServer || appenv.DEFAULT_RIPPLED_SERVER, leaseAmount: leaseAmount } }); } - async setupHostAccount(address, secret, rippledServer, governorAddress, domain, secondaryAddrsCfg) { + async setupHostAccount(address, secret, rippledServer, governorAddress, domain) { setEvernodeDefaults(governorAddress, rippledServer); @@ -84,9 +83,6 @@ class Setup { console.log(`Preparing host account:${acc.address} (domain:${domain} registry:${hostClient.config.registryAddress})`); - secondaryAddrsCfg.registryAddress = hostClient.config.registryAddress; - secondaryAddrsCfg.heartbeatAddress = hostClient.config.heartbeatAddress; - // 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. { @@ -114,7 +110,7 @@ class Setup { return acc; } - async generateBetaHostAccount(rippledServer, governorAddress, domain, secondaryAddrsCfg) { + async generateBetaHostAccount(rippledServer, governorAddress, domain) { setEvernodeDefaults(governorAddress, rippledServer); @@ -125,9 +121,6 @@ class Setup { const hostClient = new evernode.HostClient(acc.address, acc.secret); await hostClient.connect(); - secondaryAddrsCfg.registryAddress = hostClient.config.registryAddress; - secondaryAddrsCfg.heartbeatAddress = hostClient.config.heartbeatAddress; - 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 testnet cluster @@ -250,8 +243,6 @@ class Setup { const acc = this.#getConfig(false).xrpl; console.log(`Host account address: ${acc.address}`); console.log(`Governor address: ${acc?.governorAddress}`); - console.log(`Registry address: ${acc?.registryAddress}`); - console.log(`Heartbeat address: ${acc?.heartbeatAddress}`); if (!isBasic) { setEvernodeDefaults(acc.governorAddress, acc.rippledServer); @@ -259,6 +250,8 @@ class Setup { try { const hostClient = new evernode.HostClient(acc.address); await hostClient.connect(); + console.log(`Registry address: ${hostClient.config.registryAddress}`); + console.log(`Heartbeat address: ${hostClient.config.heartbeatAddress}`); setEvernodeDefaults(acc.governorAddress, acc.rippledServer, hostClient.xrplApi); @@ -300,8 +293,6 @@ class Setup { setEvernodeDefaults(governorAddress, cfg.xrpl.rippledServer, hostClient.xrplApi); cfg.xrpl.governorAddress = governorAddress; - cfg.xrpl.registryAddress = hostClient.config.registryAddress; - cfg.xrpl.heartbeatAddress = hostClient.config.heartbeatAddress; await hostClient.disconnect(); } diff --git a/mb-xrpl/package-lock.json b/mb-xrpl/package-lock.json index ca0e46a..8cba556 100644 --- a/mb-xrpl/package-lock.json +++ b/mb-xrpl/package-lock.json @@ -6,7 +6,7 @@ "": { "name": "mb-xrpl", "dependencies": { - "evernode-js-client": "0.5.16", + "evernode-js-client": "0.5.17-beta-v3.0", "sqlite3": "5.0.2" }, "devDependencies": { @@ -937,9 +937,10 @@ } }, "node_modules/evernode-js-client": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.5.16.tgz", - "integrity": "sha512-DZxbbc+RPnQXLYlipNIYcZUndOgIfEW4f+fB1cNA5ImAQL6mCeE2cpWrz6GULfOS8X99A2Fcxy7X7ny66QfT9g==", + "version": "0.5.17-beta-v3.0", + "resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.5.17-beta-v3.0.tgz", + "integrity": "sha512-7FYBqh99uwOKBCABmSDDQF1VZHknU9sqOSAT/T68M3NsU7F+QrC6vFvHLvghPZJ83g6eyzqipZRIuHflRHLmtw==", + "hasInstallScript": true, "dependencies": { "elliptic": "6.5.4", "libsodium-wrappers": "0.7.10", @@ -3931,9 +3932,9 @@ "dev": true }, "evernode-js-client": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.5.16.tgz", - "integrity": "sha512-DZxbbc+RPnQXLYlipNIYcZUndOgIfEW4f+fB1cNA5ImAQL6mCeE2cpWrz6GULfOS8X99A2Fcxy7X7ny66QfT9g==", + "version": "0.5.17-beta-v3.0", + "resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.5.17-beta-v3.0.tgz", + "integrity": "sha512-7FYBqh99uwOKBCABmSDDQF1VZHknU9sqOSAT/T68M3NsU7F+QrC6vFvHLvghPZJ83g6eyzqipZRIuHflRHLmtw==", "requires": { "elliptic": "6.5.4", "libsodium-wrappers": "0.7.10", diff --git a/mb-xrpl/package.json b/mb-xrpl/package.json index a2d003f..918b8ea 100644 --- a/mb-xrpl/package.json +++ b/mb-xrpl/package.json @@ -5,7 +5,7 @@ "build": "npm run lint && ncc build app.js --minify -o dist" }, "dependencies": { - "evernode-js-client": "0.5.17", + "evernode-js-client": "0.5.17-beta-v3.0", "sqlite3": "5.0.2" }, "devDependencies": {