├── .gitignore
├── newQRimg.jpg
├── package.json
├── new.js
├── secret2address.js
├── LICENSE
├── check_stash.js
├── submit.js
├── server_info.js
├── showQR.js
├── account_info.js
├── sign.js
├── delete.js
├── warp2account.js
├── secret2addressQR.js
├── newQR.js
├── signQR.js
├── warp2accountQR.js
├── README.md
└── yarn.lock
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
--------------------------------------------------------------------------------
/newQRimg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Duke67/xrptoolkit-nodejs/HEAD/newQRimg.jpg
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "xrptoolkit",
3 | "version": "2.0.0",
4 | "description": "A toolkit for safe and secure access to the XRP ledger (Ripple Network)",
5 | "main": "new.js",
6 | "repository": "https://github.com/Duke67/xprtoolkit-nodejs",
7 | "author": "Duke67",
8 | "license": "MIT",
9 | "dependencies": {
10 | "express": "^4.16.2",
11 | "launch-browser": "^1.0.0",
12 | "progress": "^2.0.0",
13 | "qrcode": "^1.2.0",
14 | "ripple-lib": "*"
15 | },
16 | "devDependencies": {
17 | "eslint": "*"
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/new.js:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////
2 | //
3 | // Duke67 XRPtoolkit
4 | // (C) 2017 Duke67 (MrDuke67@outlook.com)
5 | // https://github.com/Duke67/xrptoolkit-nodejs
6 | //
7 | // new_simple.js - creates new Ripple account
8 | // syntax: node new_simple
9 | //
10 | ///////////////////////////////////////////////////////////
11 |
12 | 'use strict';
13 |
14 | const RippleAPI = require('ripple-lib').RippleAPI;
15 |
16 | var api = new RippleAPI();
17 |
18 | ///////////////////////////////////////////////////////////
19 |
20 | // generate new Ripple Account
21 | var ra = api.generateAddress();
22 | var acnt = ra.address.toString();
23 | var scrt = ra.secret.toString();
24 |
25 | console.log('Ripple Account : ' + acnt);
26 | console.log('Ripple Secret : ' + scrt);
27 |
28 | ///////////////////////////////////////////////////////////
29 |
--------------------------------------------------------------------------------
/secret2address.js:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////
2 | //
3 | // Duke67 XRPtoolkit
4 | // (C) 2017 Duke67 (MrDuke67@outlook.com)
5 | // https://github.com/Duke67/xrptoolkit-nodejs
6 | //
7 | // secret2address.js - extracts full Ripple address from secret
8 | // syntax: node secret2address [SECRET]
9 | //
10 | // HINT - if not secret is provided, it generates new Ripple account
11 | //
12 | ///////////////////////////////////////////////////////////
13 |
14 | 'use strict';
15 |
16 | var keypairs = require('ripple-keypairs');
17 |
18 | var scrt = (process.argv.length > 2) ? process.argv[2] : keypairs.generateSeed();
19 |
20 | var pair = keypairs.deriveKeypair(scrt);
21 | var acnt = keypairs.deriveAddress(pair.publicKey)
22 |
23 | console.log('Ripple Account : ' + acnt);
24 | console.log('Ripple Secret : ' + scrt);
25 |
26 | ///////////////////////////////////////////////////////////
27 |
28 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017 Duke67
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/check_stash.js:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////
2 | //
3 | // Duke67 XRPtoolkit
4 | // (C) 2017 Duke67 (MrDuke67@outlook.com)
5 | // https://github.com/Duke67/xrptoolkit-nodejs
6 | //
7 | // check_stash.js - check balance of several Ripple accounts at once
8 | // syntax: node check_stash
9 | //
10 | ///////////////////////////////////////////////////////////
11 |
12 | 'use strict';
13 |
14 | const RippleAPI = require('ripple-lib').RippleAPI;
15 |
16 | const api = new RippleAPI({server: 'wss://s1.ripple.com:443'});
17 | //const api = new RippleAPI({ server: 'wss://s.altnet.rippletest.net:51233' });
18 |
19 |
20 | ///
21 | /// HINT - use text editor to preset the following array with your data
22 | ///
23 |
24 | var accounts = [
25 | 'rhT2zX6SqTycCnGfGLKBBjVnvWmuyGFb7A',
26 | 'radkxo6zoVUyYt2NfRFSnELWnxbHUuuyBp',
27 | 'r9ZWnxoJajbnyL1W73uYkQbztrwf3qRBTt'
28 | ];
29 |
30 | ///
31 |
32 | api.on('connected', () => {
33 | console.log('connected');
34 | });
35 | api.on('disconnected', (code) => {
36 | console.log('disconnected, code:', code);
37 | });
38 | api.on('error', (errorCode, errorMessage) => {
39 | console.log(errorCode + ': ' + errorMessage);
40 | });
41 |
42 | ///
43 |
44 | api.connect().then(() => {
45 |
46 | console.log('Account queried...');
47 |
48 | for (var i = 0; i < accounts.length; i++) {
49 |
50 | var acnt = accounts[i];
51 | console.log('Account : ' + acnt);
52 |
53 | api.getBalances(acnt).then(balances => {
54 | console.log(JSON.stringify(balances, null, 2));
55 | });
56 |
57 | }
58 |
59 | }).then(() => {
60 |
61 | console.log('Balance is coming now...');
62 |
63 | }).then(() => {
64 |
65 | api.disconnect();
66 |
67 | }).catch(console.error);
68 |
69 | ///////////////////////////////////////////////////////////
70 |
71 |
--------------------------------------------------------------------------------
/submit.js:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////
2 | //
3 | // Duke67 XRPtoolkit
4 | // (C) 2017 Duke67 (MrDuke67@outlook.com)
5 | // https://github.com/Duke67/xrptoolkit-nodejs
6 | //
7 | // submit.js - submits signed transaction to Ripple network
8 | // syntax: node submit [RCL|TEST] SIGNED_TX
9 | //
10 | ///////////////////////////////////////////////////////////
11 |
12 | 'use strict';
13 |
14 | const RippleAPI = require('ripple-lib').RippleAPI;
15 |
16 | ///////////////////////////////////////////////////////////
17 |
18 | var api;
19 | var net = process.argv[2];
20 | var signedTx = 'NULL';
21 |
22 | if (net == 'TEST') {
23 | api = new RippleAPI({ server: 'wss://s.altnet.rippletest.net:51233' });
24 | } else {
25 | api = new RippleAPI({ server: 'wss://s1.ripple.com:443' });
26 | }
27 |
28 | ///////////////////////////////////////////////////////////
29 |
30 | signedTx = process.argv[3];
31 |
32 | console.log('XRPtk-nodejs: submit ' + signedTx);
33 |
34 | ///////////////////////////////////////////////////////////
35 |
36 | api.on('connected', () => {
37 | process.exitCode = 1;
38 | console.log('connected');
39 | });
40 | api.on('disconnected', (code) => {
41 | console.log('disconnected, code:', code);
42 | });
43 | api.on('error', (errorCode, errorMessage) => {
44 | console.log(errorCode + ': ' + errorMessage);
45 | });
46 |
47 | ///////////////////////////////////////////////////////////
48 |
49 | function quit(message) {
50 | return api.disconnect();
51 | console.log(message);
52 | process.exit(0);
53 | }
54 |
55 | function fail(message) {
56 | return api.disconnect();
57 | console.error(message);
58 | process.exit(1);
59 | }
60 |
61 | ///////////////////////////////////////////////////////////
62 |
63 | api.connect().then(() => {
64 |
65 | api.submit(signedTx).then(quit, fail);
66 |
67 | }).catch(fail);
68 |
69 | ///////////////////////////////////////////////////////////
70 |
--------------------------------------------------------------------------------
/server_info.js:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////
2 | //
3 | // Duke67 XRPtoolkit
4 | // (C) 2017 Duke67 (MrDuke67@outlook.com)
5 | // https://github.com/Duke67/xrptoolkit-nodejs
6 | //
7 | // server_info.js - shows server's state info
8 | // syntax: node server_info [RCL|TEST]
9 | //
10 | // HINT - see "validatedLedger"."ledgerVersion" to determine
11 | // maximum ledger when signing payment offline
12 | //
13 | ///////////////////////////////////////////////////////////
14 |
15 | 'use strict';
16 |
17 | const RippleAPI = require('ripple-lib').RippleAPI;
18 |
19 | ///////////////////////////////////////////////////////////
20 |
21 | var api;
22 | var net = process.argv[2];
23 |
24 | if (net == 'TEST') {
25 | api = new RippleAPI({ server: 'wss://s.altnet.rippletest.net:51233' });
26 | } else {
27 | api = new RippleAPI({ server: 'wss://s1.ripple.com:443' });
28 | }
29 |
30 | ///////////////////////////////////////////////////////////
31 |
32 | var acnt = process.argv[3];
33 |
34 | console.log('XRPtk-nodejs: server_info ');
35 |
36 | ///////////////////////////////////////////////////////////
37 |
38 | api.on('connected', () => {
39 | process.exitCode = 1;
40 | console.log('connected');
41 | });
42 | api.on('disconnected', (code) => {
43 | console.log('disconnected, code:', code);
44 | });
45 | api.on('error', (errorCode, errorMessage) => {
46 | console.log(errorCode + ': ' + errorMessage);
47 | });
48 |
49 | ///////////////////////////////////////////////////////////
50 |
51 | function getState(){
52 | return api.getServerInfo().then(info => {
53 | //balance = info.xrpBalance;
54 | //console.log(info.xrpBalance);
55 | return info;
56 | });
57 | }
58 |
59 | ///////////////////////////////////////////////////////////
60 |
61 | api.connect().then(() => {
62 |
63 | return getState();
64 |
65 | }).then(info => {
66 |
67 | console.log('Server info :' + JSON.stringify(info, null, 2));
68 |
69 | }).then(() => {
70 |
71 | return api.disconnect();
72 |
73 | }).catch(console.error);
74 |
75 | ///////////////////////////////////////////////////////////
76 |
--------------------------------------------------------------------------------
/showQR.js:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////
2 | //
3 | // Duke67 XRPtoolkit
4 | // (C) 2017 Duke67 (MrDuke67@outlook.com)
5 | // https://github.com/Duke67/xrptoolkit-nodejs
6 | //
7 | // showQR.js - generate a QR code for provided text
8 | // syntax: node showQR [TEXT]
9 | //
10 | ///////////////////////////////////////////////////////////
11 |
12 | 'use strict';
13 |
14 | var express = require('express');
15 | var qrcode = require('qrcode');
16 | var launcher = require('launch-browser');
17 |
18 | var txt = "USE_A_REAL_TEXT_STRING";
19 |
20 | if(process.argv.length > 2) {
21 | txt = process.argv[2];
22 | }
23 |
24 | console.log('Source Text : ' + txt);
25 |
26 | ///////////////////////////////////////////////////////////
27 |
28 | var app = express();
29 |
30 | app.get('/', function(req, res) {
31 |
32 | res.writeHead(200, { 'Content-Type': 'text/html' });
33 |
34 | // display it in a web browser
35 | var html = "";
36 | html += "
XRPtoolkit by Duke67";
37 | html += "";
38 |
39 | html += "
XRPtoolkit by Duke67
";
40 | html += "
QR code generator
";
41 |
42 | var opts = {
43 | errorCorrectionLevel: 'H',
44 | type: 'image/png',
45 | scale: 10
46 | };
47 |
48 | // generate QR code of a text string
49 | qrcode.toDataURL(txt, opts, function (err, url1) {
50 |
51 | // display it in the web browser
52 | html += "
";
53 | html += "Source Text : ";
54 | html += txt + " ";
55 | html += " ";
56 | html += "
";
57 |
58 | html += "";
59 |
60 | res.end(html);
61 |
62 | });
63 |
64 |
65 | });
66 |
67 | //console.log('To see the QR code, point your web browser to http://localhost:3000/');
68 | console.log('Press Ctrl+C to quit this script.');
69 |
70 | app.listen(3000);
71 |
72 | launcher('http://localhost:3000/', { browser: ['chrome', 'firefox', 'safari'] }, function(e, browser){
73 | if(e) return console.log(e);
74 | });
75 |
76 | ///////////////////////////////////////////////////////////
77 |
78 |
--------------------------------------------------------------------------------
/account_info.js:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////
2 | //
3 | // Duke67 XRPtoolkit
4 | // (C) 2017 Duke67 (MrDuke67@outlook.com)
5 | // https://github.com/Duke67/xrptoolkit-nodejs
6 | //
7 | // account_info.js - displays account's basic info
8 | // syntax: node account_info [RCL|TEST] ACCOUNT
9 | //
10 | // HINT - see Sequence to determine source account's
11 | // sequence, when signing payment offline
12 | //
13 | ///////////////////////////////////////////////////////////
14 |
15 | 'use strict';
16 | const RippleAPI = require('ripple-lib').RippleAPI;
17 |
18 | ///////////////////////////////////////////////////////////
19 |
20 | var api;
21 | var net = process.argv[2];
22 |
23 | if (net == 'TEST') {
24 | api = new RippleAPI({ server: 'wss://s.altnet.rippletest.net:51233' });
25 | } else {
26 | api = new RippleAPI({ server: 'wss://s1.ripple.com:443' });
27 | }
28 |
29 | ///////////////////////////////////////////////////////////
30 |
31 | var acnt = process.argv[3];
32 |
33 | console.log('XRPtk-nodejs: account_info ' + acnt);
34 |
35 | ///////////////////////////////////////////////////////////
36 |
37 | api.on('connected', () => {
38 | process.exitCode = 1;
39 | console.log('connected');
40 | });
41 | api.on('disconnected', (code) => {
42 | console.log('disconnected, code:', code);
43 | });
44 | api.on('error', (errorCode, errorMessage) => {
45 | console.log(errorCode + ': ' + errorMessage);
46 | });
47 |
48 | ///////////////////////////////////////////////////////////
49 |
50 | function getAccount(address){
51 | return api.getAccountInfo(address).then(info => {
52 | //balance = info.xrpBalance;
53 | //console.log(info.xrpBalance);
54 | return info;
55 | });
56 | }
57 |
58 | ///////////////////////////////////////////////////////////
59 |
60 | api.connect().then(() => {
61 |
62 | return getAccount(acnt);
63 |
64 | }).then(info => {
65 |
66 | console.log("Balance : " + info.xrpBalance);
67 | console.log("Sequence: " + info.sequence);
68 |
69 | }).then(() => {
70 |
71 | return api.disconnect();
72 |
73 | }).catch(console.error);
74 |
75 | ///////////////////////////////////////////////////////////
76 |
--------------------------------------------------------------------------------
/sign.js:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////
2 | //
3 | // Duke67 XRPtoolkit
4 | // (C) 2017 Duke67 (MrDuke67@outlook.com)
5 | // https://github.com/Duke67/xrptoolkit-nodejs
6 | //
7 | // sign_simple.js - signs XRP payment offline
8 | // syntax: node sign SRC SECRET SEQ DST DSTTAG AMOUNT MAXLEDGER
9 | //
10 | ///////////////////////////////////////////////////////////
11 |
12 | 'use strict';
13 |
14 | const RippleAPI = require('ripple-lib').RippleAPI;
15 |
16 | var api = new RippleAPI();
17 |
18 | ///
19 | /// HINT
20 | /// 1. use editor to preset the following variables with your data
21 | /// 2. create custom copies of this script for frequent payments
22 | ///
23 |
24 | var src = 'raakAtsGGZGGs8xb8AxDEUyWj7UxNGHGb7'; // source account
25 | var dst = 'rGNLJ5VLZWKt7RrQrbyUZjXa2mCCcEenpu'; // destination account
26 | var tag = '123'; // destination tag
27 | var scrt = 'shkJ3HM8jcrKvpYAifJhwvkaGDEtm'; // source account's secret
28 |
29 | var amnt = 1000000; // payment amount in XRP drops (1,000,000 drops = 1 XRP)
30 | var ccy = 'XRP'; // currency (only XRP is supported for now)
31 | var lgr = 35000000; // maximum ledger
32 | var seq = 1; // source account's sequence (to get this info, use XRPtoolkit-Android or account_info.js)
33 | var fee = 12; // fee (default is 12 drops, can be increased)
34 |
35 | ///
36 |
37 | process.argv.forEach(function (val, index, array) {
38 |
39 | //console.log(index + ': ' + val);
40 |
41 | switch(index) {
42 | case 2:src = val;break;
43 | case 3:scrt = val;break;
44 | case 4:seq = val;break;
45 | case 5:dst = val;break;
46 | case 6:tag = val;break;
47 | case 7:amnt = val;break;
48 | case 8:lgr = val;break;
49 | default:break;
50 | }
51 |
52 | });
53 |
54 | ///////////////////////////////////////////////////////////
55 |
56 | var rawTx = '{"TransactionType":"Payment","Account":"' + src +
57 | '","Destination":"' + dst +
58 | '","DestinationTag":"' + tag +
59 | '","Amount":"' + amnt +
60 | '","Flags":2147483648,' +
61 | '"LastLedgerSequence":' + lgr +
62 | ',"Fee":"' + fee +
63 | '","Sequence":' + seq + '}';
64 |
65 | ///////////////////////////////////////////////////////////
66 |
67 | console.log();
68 | console.log(rawTx);
69 |
70 | var signedTx = api.sign(rawTx, scrt);
71 |
72 | console.log();
73 | console.log('SIGNED TX:');
74 | console.log();
75 | console.log(signedTx.signedTransaction);
76 | console.log();
77 |
78 | ///////////////////////////////////////////////////////////
79 |
80 |
--------------------------------------------------------------------------------
/delete.js:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////
2 | //
3 | // Duke67 XRPtoolkit
4 | // (C) 2020 Duke67 (MrDuke67@outlook.com)
5 | // https://github.com/Duke67/xrptoolkit-nodejs
6 | //
7 | // delete.js - delete XRP account
8 | // syntax: node delete [XRPL|TEST] ACCOUNT SECRET SEQ DST DSTTAG
9 | //
10 | ///////////////////////////////////////////////////////////
11 |
12 | 'use strict';
13 |
14 | const RippleAPI = require('ripple-lib').RippleAPI;
15 |
16 | var api;
17 | var net = process.argv[2];
18 |
19 |
20 | if (net == 'TEST') {
21 | api = new RippleAPI({ server: 'wss://s.altnet.rippletest.net:51233', maxFeeXRP: '5' });
22 | } else {
23 | api = new RippleAPI({ server: 'wss://s1.ripple.com:443', maxFeeXRP: '5' });
24 | }
25 |
26 |
27 |
28 | ///
29 | /// HINT
30 | /// 1. use editor to preset the following variables with your data
31 | /// 2. create custom copies of this script for frequent payments
32 | ///
33 |
34 | var src = 'rHqaHPMmdWWSv2EmXGDwXmtgnC5hXR5zUy'; // account to be deleted
35 | var dst = 'r4qSyg6j77me6seoBEDKXF3tueFiZtP5t2'; // destination account
36 | var tag = '123'; // destination tag
37 | var scrt = 'spvdQ8sHG6wCP7K7nGHGUpe4LLFkq'; // source account's secret
38 |
39 | var seq = 1; // source account's sequence (to get this info, use XRPtoolkit-Android or account_info.js)
40 | var fee = 5000000; // fee (default is 5 XRPs (5000000 drops)
41 |
42 | ///
43 |
44 | process.argv.forEach(function (val, index, array) {
45 |
46 | console.log(index + ': ' + val);
47 |
48 | switch(index) {
49 | case 2:net = val;break;
50 | case 3:src = val;break;
51 | case 4:scrt = val;break;
52 | case 5:seq = val;break;
53 | case 6:dst = val;break;
54 | case 7:tag = val;break;
55 | default:break;
56 | }
57 |
58 | });
59 |
60 | ///////////////////////////////////////////////////////////
61 |
62 | var rawTx = '{"TransactionType":"AccountDelete",' +
63 | '"Account":"' + src +
64 | '","Destination":"' + dst +
65 | '","DestinationTag":' + tag +
66 | ',"Fee":"' + fee +
67 | '","Sequence":' + seq +
68 | ',"Flags":2147483648' +
69 | '}';
70 |
71 | ///////////////////////////////////////////////////////////
72 |
73 | console.log();
74 | console.log(rawTx);
75 |
76 | api.connect().then(() => {
77 |
78 | console.log('WORKING:');
79 |
80 | var sgnd = api.sign(rawTx, scrt).signedTransaction;
81 | console.log(sgnd);
82 |
83 | api.submit(sgnd).then( response => {
84 | console.log('RESPONSE:');
85 | console.log(response.resultCode, response.resultMessage);
86 | }).catch(console.error)
87 |
88 | }).then(() => {
89 |
90 | console.log('AccountDelete is being processed by XRPL...');
91 |
92 | }).then(() => {
93 |
94 | api.disconnect();
95 |
96 | }).catch(console.error);
97 |
98 | console.log();
99 |
100 | ///////////////////////////////////////////////////////////
101 |
102 |
--------------------------------------------------------------------------------
/warp2account.js:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////
2 | //
3 | // Duke67 XRPtoolkit
4 | // (C) 2017 Duke67 (MrDuke67@outlook.com)
5 | // https://github.com/Duke67/xrptoolkit-nodejs
6 | //
7 | // warp2account.js - extracts ripple account secret and address from
8 | // RippleWarpWallet password and salt.
9 | //
10 | // syntax: node warp2account [PASSWORD] [SALT]
11 | //
12 | // HINT - default salt can be set in the file to make the salt argument optional
13 | //
14 | ///////////////////////////////////////////////////////////
15 |
16 | 'use strict';
17 |
18 | // HINT - Change this to your email address or whatever other salt
19 | // you would like to use so you don't have to type it in to the
20 | // command line every time.
21 | var DEFAULT_SALT = null;
22 |
23 | var warp = require('ripplewarpwallet');
24 | var ProgressBar = require('progress');
25 |
26 |
27 | if (process.argv.length < 3) {
28 | console.log('Must supply warp password and optional salt. ' + (DEFAULT_SALT === null ? '' : 'Default salt is set to: ' + DEFAULT_SALT));
29 | return 0;
30 | } else if (DEFAULT_SALT === null && process.argv.length < 4) {
31 | console.log('!!!WARNING! Proceeding without salt!!!');
32 | }
33 |
34 | var password = process.argv[2];
35 | var salt = DEFAULT_SALT
36 | if (salt === null) {
37 | if (process.argv.length > 3) {
38 | salt = process.argv[3];
39 | } else {
40 | salt = '';
41 | }
42 | console.log('Proceeding with password "' + password + '" and salt "' + salt + '".');
43 | } else {
44 | console.log('Proceeding with password "' + password + '" and default salt "' + salt + '".');
45 | }
46 |
47 | const params = {
48 | passphrase : password,
49 | salt : salt,
50 | progress_hook : logOutput
51 | };
52 |
53 | var startedScrypt = false;
54 | var startedPbkdf2 = false;
55 | var scryptBar;
56 | var pbkdf2Bar;
57 | var lastProgress = 0;
58 | function logOutput(progress) {
59 | if (progress.what === 'scrypt') {
60 | if (startedScrypt) {
61 | scryptBar.tick(progress.i - lastProgress);
62 | lastProgress = progress.i;
63 | if (lastProgress === progress.total) {
64 | lastProgress = 0;
65 | }
66 | } else {
67 | scryptBar = new ProgressBar('Scrypt: [:bar] :percent', {
68 | complete: '#',
69 | incomplete: ' ',
70 | total: 524288
71 | });
72 | startedScrypt = true;
73 | }
74 | }
75 | if (progress.what === 'pbkdf2') {
76 | if (startedPbkdf2) {
77 | pbkdf2Bar.tick(progress.i - lastProgress);
78 | lastProgress = progress.i;
79 | if (lastProgress === progress.total) {
80 | lastProgress = 0;
81 | }
82 | } else {
83 | pbkdf2Bar = new ProgressBar('PBKDF2: [:bar] :percent', {
84 | complete: '#',
85 | incomplete: ' ',
86 | total: 65536
87 | });
88 | startedPbkdf2 = true;
89 | }
90 | }
91 | }
92 |
93 | function done(res) {
94 | console.log('Ripple Address : ' + res.address);
95 | console.log('Ripple Secret : ' + res.secret);
96 | console.log('///// ADVANCED /////');
97 | console.log('Raw Private Key : ' + res.privateKey);
98 | console.log('Raw Public Key : ' + res.publicKey);
99 | }
100 |
101 | warp(params, done);
102 |
103 | ///////////////////////////////////////////////////////////
104 |
105 |
--------------------------------------------------------------------------------
/secret2addressQR.js:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////
2 | //
3 | // Duke67 XRPtoolkit
4 | // (C) 2017 Duke67 (MrDuke67@outlook.com)
5 | // https://github.com/Duke67/xrptoolkit-nodejs
6 | //
7 | // secret2addressQR.js - extracts full Ripple address from secret
8 | // syntax: node secret2addressQR [SECRET]
9 | //
10 | // HINT - if not secret is provided, it generates new Ripple account
11 | //
12 | ///////////////////////////////////////////////////////////
13 |
14 | 'use strict';
15 |
16 | var express = require('express');
17 | var qrcode = require('qrcode');
18 | var launcher = require('launch-browser');
19 |
20 | var keypairs = require('ripple-keypairs');
21 |
22 | var scrt = (process.argv.length > 2) ? process.argv[2] : keypairs.generateSeed();
23 |
24 | ///////////////////////////////////////////////////////////
25 |
26 | var app = express();
27 |
28 | app.get('/', function(req, res) {
29 |
30 | res.writeHead(200, { 'Content-Type': 'text/html' });
31 |
32 | // derive full Ripple address
33 | var pair = keypairs.deriveKeypair(scrt);
34 | var acnt = keypairs.deriveAddress(pair.publicKey)
35 |
36 | // display it in a web browser
37 | var html = "";
38 | html += "XRPtoolkit by Duke67";
39 | html += "";
40 |
41 | html += "
XRPtoolkit by Duke67
";
42 | html += "
Ripple Account was extracted from Secret
";
43 |
44 | var opts = {
45 | errorCorrectionLevel: 'H',
46 | type: 'image/png',
47 | scale: 10
48 | };
49 |
50 | // generate QR code of Ripple Address (public)
51 | qrcode.toDataURL(acnt, opts, function (err, url1) {
52 |
53 | // display it in the web browser
54 | html += "
";
55 | html += "Ripple Account:
";
56 | html += acnt + " ";
57 | html += " ";
58 | html += "
";
59 | });
60 |
61 | // generate QR code of Ripple Secret (private)
62 | opts.color.dark = '#F00'; // show Ripple secret in RED
63 | opts.scale = 5; // make Ripple secret SMALLER than account
64 | qrcode.toDataURL(scrt, opts, function (err2, url2) {
65 |
66 | // display it in the web browser
67 | html += "
";
68 | html += "Ripple Secret:
";
69 |
70 | // include script to display Ripple Secret (initially hidden for security purposes)
71 | html += ""
74 |
75 | // Reveal button
76 | html += "";
77 |
78 | html += "
";
79 | html += scrt + " ";
80 | html += " ";
81 | html += "
";
82 |
83 | html += "
";
84 | html += "";
85 |
86 | res.end(html);
87 | });
88 |
89 |
90 |
91 | });
92 |
93 | //console.log('To see the QR code, point your web browser to http://localhost:3000/');
94 | console.log('Press Ctrl+C to quit this script.');
95 |
96 | app.listen(3000);
97 |
98 | launcher('http://localhost:3000/', { browser: ['chrome', 'firefox', 'safari'] }, function(e, browser){
99 | if(e) return console.log(e);
100 | });
101 |
102 | ///////////////////////////////////////////////////////////
103 |
104 |
--------------------------------------------------------------------------------
/newQR.js:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////
2 | //
3 | // Duke67 XRPtoolkit
4 | // (C) 2017 Duke67 (MrDuke67@outlook.com)
5 | // https://github.com/Duke67/xrptoolkit-nodejs
6 | //
7 | // new.js - creates new Ripple account and shows its QR codes
8 | // syntax: node new
9 | //
10 | ///////////////////////////////////////////////////////////
11 |
12 | 'use strict';
13 |
14 | const RippleAPI = require('ripple-lib').RippleAPI;
15 |
16 | var express = require('express');
17 | var qrcode = require('qrcode');
18 | var launcher = require('launch-browser');
19 |
20 | var api = new RippleAPI();
21 |
22 | ///////////////////////////////////////////////////////////
23 |
24 | var app = express();
25 |
26 | app.get('/', function(req, res) {
27 |
28 | res.writeHead(200, { 'Content-Type': 'text/html' });
29 |
30 | // generate new Ripple Account
31 | var ra = api.generateAddress();
32 | var acnt = ra.address.toString();
33 | var scrt = ra.secret.toString();
34 |
35 | //console.log('Ripple Account : ' + acnt);
36 | //console.log('Ripple Secret : go to http://localhost:3000/ and click "Reveal" button');
37 |
38 |
39 | // display it in a web browser
40 | var html = "";
41 | html += "XRPtoolkit by Duke67";
42 | html += "";
43 |
44 | html += "
XRPtoolkit by Duke67
";
45 | html += "
New Ripple Account has been generated
";
46 |
47 | var opts = {
48 | errorCorrectionLevel: 'H',
49 | type: 'image/png',
50 | scale: 10
51 | };
52 |
53 | // generate QR code of Ripple Address (public)
54 | qrcode.toDataURL(acnt, opts, function (err, url1) {
55 |
56 | // display it in the web browser
57 | html += "
";
58 | html += "Ripple Account:
";
59 | html += acnt + " ";
60 | html += " ";
61 | html += "
";
62 | });
63 |
64 | // generate QR code of Ripple Secret (private)
65 | opts.color.dark = '#F00'; // show Ripple secret in RED
66 | opts.scale = 5; // make Ripple secret SMALLER than account
67 | qrcode.toDataURL(scrt, opts, function (err2, url2) {
68 |
69 | // display it in the web browser
70 | html += "
";
71 | html += "Ripple Secret:
";
72 |
73 | // include script to display Ripple Secret (initially hidden for security purposes)
74 | html += ""
77 |
78 | // Reveal button
79 | html += "";
80 |
81 | html += "
";
82 | html += scrt + " ";
83 | html += " ";
84 | html += "
";
85 |
86 | html += "
";
87 | html += "";
88 |
89 | res.end(html);
90 | });
91 |
92 |
93 |
94 | });
95 |
96 | //console.log('To see the QR code, point your web browser to http://localhost:3000/');
97 | console.log('Press Ctrl+C to quit this script.');
98 |
99 | app.listen(3000);
100 |
101 | launcher('http://localhost:3000/', { browser: ['chrome', 'firefox', 'safari'] }, function(e, browser){
102 | if(e) return console.log(e);
103 | });
104 |
105 | ///////////////////////////////////////////////////////////
106 |
107 |
--------------------------------------------------------------------------------
/signQR.js:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////
2 | //
3 | // Duke67 XRPtoolkit
4 | // (C) 2017 Duke67 (MrDuke67@outlook.com)
5 | // https://github.com/Duke67/xrptoolkit-nodejs
6 | //
7 | // sign.js - signs XRP payment offline and displays
8 | // signed transaction blob in a QR code
9 | // syntax: node sign SRC SECRET SEQ DST DSTTAG AMOUNT MAXLEDGER
10 | //
11 | ///////////////////////////////////////////////////////////
12 |
13 | 'use strict';
14 |
15 | const RippleAPI = require('ripple-lib').RippleAPI;
16 |
17 | var express = require('express');
18 | var qrcode = require('qrcode');
19 | var launcher = require('launch-browser');
20 |
21 | var api = new RippleAPI();
22 |
23 | ///
24 | /// HINT
25 | /// 1. use editor to preset the following variables with your data
26 | /// 2. create custom copies of this script for frequent payments
27 | ///
28 |
29 | var src = 'raakAtsGGZGGs8xb8AxDEUyWj7UxNGHGb7'; // source account
30 | var dst = 'rGNLJ5VLZWKt7RrQrbyUZjXa2mCCcEenpu'; // destination account
31 | var tag = '123'; // destination tag (can be ignored if not rquired by receipent)
32 | var scrt = 'shkJ3HM8jcrKvpYAifJhwvkaGDEtm'; // source account's secret
33 |
34 | var amnt = 1000000; // payment amount in XRP drops (1,000,000 drops = 1 XRP)
35 | var ccy = 'XRP'; // currency (only XRP is supported for now)
36 | var lgr = 35000000; // maximum ledger
37 | var seq = 1; // source account's sequence (to get this info, use XRPtoolkit-Android or account_info.js)
38 | var fee = 12; // fee (default is 12 drops, can be increased if necessary)
39 |
40 | ///////////////////////////////////////////////////////////
41 |
42 | process.argv.forEach(function (val, index, array) {
43 |
44 | //console.log(index + ': ' + val);
45 |
46 | switch(index) {
47 | case 2:src = val;break;
48 | case 3:scrt = val;break;
49 | case 4:seq = val;break;
50 | case 5:dst = val;break;
51 | case 6:tag = val;break;
52 | case 7:amnt = val;break;
53 | case 8:lgr = val;break;
54 | default:break;
55 | }
56 |
57 | });
58 |
59 | ///
60 |
61 | var rawTx = '{"TransactionType":"Payment","Account":"' + src +
62 | '","Destination":"' + dst +
63 | '","DestinationTag":"' + tag +
64 | '","Amount":"' + amnt +
65 | '","Flags":2147483648,' +
66 | '"LastLedgerSequence":' + lgr +
67 | ',"Fee":"' + fee +
68 | '","Sequence":' + seq + '}';
69 |
70 | ///////////////////////////////////////////////////////////
71 |
72 | var app = express();
73 |
74 | app.get('/', function(req, res) {
75 |
76 | res.writeHead(200, { 'Content-Type': 'text/html' });
77 |
78 | var signedTx = api.sign(rawTx, scrt);
79 |
80 | console.log();
81 | console.log(rawTx);
82 |
83 | console.log();
84 | console.log('SIGNED TX:');
85 | console.log();
86 | console.log(signedTx.signedTransaction);
87 | console.log();
88 |
89 | //console.log('To see the QR code, point your web browser to http://localhost:3000/');
90 | console.log('Press Ctrl+C to quit this script.');
91 |
92 |
93 | var html = "";
94 | html += "XRPtoolkit by Duke67";
95 | html += "";
96 | html += "";
97 |
98 | html += "
";
99 | html += "XRPtoolkit by Duke67";
100 | html += "
";
101 |
102 | html += "
";
103 | html += "Ripple Payment was signed";
104 | html += "
";
134 | html += "Signed Transaction ";
135 | html += "
";
136 |
137 | html += "
";
138 | html += "QR code: ";
139 | html += " ";
140 | html += "
";
141 |
142 | html += "
";
143 | html += "Blob:
";
144 | html += "";
145 | html += signedTx.signedTransaction;
146 | html += "";
147 | html += "
";
148 |
149 | html += "";
150 |
151 | res.end(html);
152 | });
153 |
154 |
155 | });
156 |
157 | app.listen(3000);
158 |
159 | launcher('http://localhost:3000/', { browser: ['chrome', 'firefox', 'safari'] }, function(e, browser){
160 | if(e) return console.log(e);
161 | });
162 |
163 | ///////////////////////////////////////////////////////////
164 |
165 |
--------------------------------------------------------------------------------
/warp2accountQR.js:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////
2 | //
3 | // Duke67 XRPtoolkit
4 | // (C) 2017 Duke67 (MrDuke67@outlook.com)
5 | // https://github.com/Duke67/xrptoolkit-nodejs
6 | //
7 | // warp2account.js - extracts ripple account secret and address from
8 | // RippleWarpWallet password and salt.
9 | //
10 | // syntax: node warp2account [PASSWORD] [SALT]
11 | //
12 | // HINT - default salt can be set in the file to make the salt argument optional
13 | //
14 | ///////////////////////////////////////////////////////////
15 |
16 | 'use strict';
17 |
18 | // HINT - Change this to your email address or whatever other salt
19 | // you would like to use so you don't have to type it in to the
20 | // command line every time.
21 | var DEFAULT_SALT = null;
22 |
23 | var express = require('express');
24 | var qrcode = require('qrcode');
25 | var launcher = require('launch-browser');
26 | var warp = require('ripplewarpwallet');
27 | var ProgressBar = require('progress');
28 |
29 | if (DEFAULT_SALT === null && process.argv.length < 4) {
30 | console.log('!!!WARNING! Proceeding without salt!!!');
31 | } else if (process.argv.length < 3) {
32 | console.log('Must supply warp password and optional salt. ' + DEFAULT_SALT === null ? '' : 'Default salt is set to: ' + DEFAULT_SALT);
33 | }
34 |
35 | var password = process.argv[2];
36 | var salt = DEFAULT_SALT
37 | if (salt === null) {
38 | if (process.argv.length > 3) {
39 | salt = process.argv[3];
40 | } else {
41 | salt = '';
42 | }
43 | console.log('Proceeding with password "' + password + '" and salt "' + salt + '".');
44 | } else {
45 | console.log('Proceeding with password "' + password + '" and default salt "' + salt + '".');
46 | }
47 |
48 | const params = {
49 | passphrase : password,
50 | salt : salt,
51 | progress_hook : logOutput
52 | };
53 |
54 | var startedScrypt = false;
55 | var startedPbkdf2 = false;
56 | var scryptBar;
57 | var pbkdf2Bar;
58 | var lastProgress = 0;
59 | function logOutput(progress) {
60 | if (progress.what === 'scrypt') {
61 | if (startedScrypt) {
62 | scryptBar.tick(progress.i - lastProgress);
63 | lastProgress = progress.i;
64 | if (lastProgress === progress.total) {
65 | lastProgress = 0;
66 | }
67 | } else {
68 | scryptBar = new ProgressBar('Scrypt: [:bar] :percent', {
69 | complete: '#',
70 | incomplete: ' ',
71 | total: 524288
72 | });
73 | startedScrypt = true;
74 | }
75 | }
76 | if (progress.what === 'pbkdf2') {
77 | if (startedPbkdf2) {
78 | pbkdf2Bar.tick(progress.i - lastProgress);
79 | lastProgress = progress.i;
80 | if (lastProgress === progress.total) {
81 | lastProgress = 0;
82 | }
83 | } else {
84 | pbkdf2Bar = new ProgressBar('PBKDF2: [:bar] :percent', {
85 | complete: '#',
86 | incomplete: ' ',
87 | total: 65536
88 | });
89 | startedPbkdf2 = true;
90 | }
91 | }
92 | }
93 |
94 | function done(res) {
95 | var acnt = res.address;
96 | var scrt = res.secret;
97 | console.log('Ripple Address : ' + res.address);
98 | console.log('Ripple Secret : ' + res.secret);
99 | console.log('///// ADVANCED /////');
100 | console.log('Raw Private Key : ' + res.privateKey);
101 | console.log('Raw Public Key : ' + res.publicKey);
102 | display(scrt, acnt);
103 | }
104 |
105 | warp(params, done);
106 |
107 | ///////////////////////////////////////////////////////////
108 |
109 | function display(scrt, acnt) {
110 | var app = express();
111 |
112 | app.get('/', function(req, res) {
113 |
114 | res.writeHead(200, { 'Content-Type': 'text/html' });
115 |
116 | // display it in a web browser
117 | var html = "";
118 | html += "XRPtoolkit by Duke67";
119 | html += "";
120 |
121 | html += "
XRPtoolkit by Duke67
";
122 | html += "
RippleWarpWallet by termhn
";
123 | html += "
Ripple Account was extracted:
";
124 |
125 | var opts = {
126 | errorCorrectionLevel: 'H',
127 | type: 'image/png',
128 | scale: 10
129 | };
130 |
131 | // generate QR code of Ripple Address (public)
132 | qrcode.toDataURL(acnt, opts, function (err, url1) {
133 |
134 | // display it in the web browser
135 | html += "
";
136 | html += "Ripple Account:
";
137 | html += acnt + " ";
138 | html += " ";
139 | html += "
";
140 | });
141 |
142 | // generate QR code of Ripple Secret (private)
143 | opts.color.dark = '#F00'; // show Ripple secret in RED
144 | opts.scale = 5; // make Ripple secret SMALLER than account
145 | qrcode.toDataURL(scrt, opts, function (err2, url2) {
146 |
147 | // display it in the web browser
148 | html += "
";
149 | html += "Ripple Secret:
";
150 |
151 | // include script to display Ripple Secret (initially hidden for security purposes)
152 | html += ""
155 |
156 | // Reveal button
157 | html += "";
158 |
159 | html += "
";
160 | html += scrt + " ";
161 | html += " ";
162 | html += "
";
163 |
164 | html += "
";
165 | html += "";
166 |
167 | res.end(html);
168 | });
169 |
170 |
171 |
172 | });
173 |
174 | //console.log('To see the QR code, point your web browser to http://localhost:3000/');
175 | console.log('Press Ctrl+C to quit this script.');
176 |
177 | app.listen(3000);
178 |
179 | launcher('http://localhost:3000/', { browser: ['chrome', 'firefox', 'safari'] }, function(e, browser){
180 | if(e) return console.log(e);
181 | });
182 | }
183 |
184 | ///////////////////////////////////////////////////////////
185 |
186 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # xrptoolkit-nodejs
2 |
3 | A toolkit for safe and secure access to XRP ledger (Ripple Network).
4 |
5 | If used properly, these tools allow you to actively use your XRP assets, while keeping the highest possible level of safety and security
6 |
7 |
8 | # Features
9 | - Follows and leverages Ripple’s Reliable Transaction Submission
10 | - Allows you to keep sensitive info (Ripple Secret) always offline and thus secure
11 | - Maintains the air-gap between online and offline devices
12 | - Connected device can only see encrypted data
13 | - QR codes and OCR makes data transfers quick and convenient
14 | - Avoids using USB devices
15 | - Clean and compact code allows inspection by end-user, 3rd party or community
16 |
17 |
18 | # Functionality
19 | - Access to XRP ledger from:
20 | - Node.js (Linux, MacOS, Windows)
21 | - Android client (xrptoolkit-android)
22 | - iOS client (xrptoolkit-ios - planned)
23 | - Monitors XRP ledger (ledger, accounts, balances, etc.)
24 | - Securely creates new accounts (offline)
25 | - Securely signs payments (offline)
26 | - Submits offline-signed transactions to XRP ledger
27 | - Extracts Ripple address (public) from Ripple secret (private)
28 | - Shows Ripple address as a QR code
29 | - NEW: AccountDelete
30 |
31 |
32 | # Getting started
33 | First try to familiarize yourself with how Ripple network works:
34 | - [Ripple Developer Center](https://ripple.com/build/)
35 | - [Ripple API Beginners Guide](https://ripple.com/build/rippleapi-beginners-guide/)
36 | - [Reliable Transaction Submission](https://ripple.com/build/reliable-transaction-submission/)
37 |
38 |
39 | # Installation (Online computer)
40 |
41 | Install Dependencies
42 |
43 | Install Node.js, if you haven't already. In the following steps, either `yarn` or `npm` can be used, but `yarn` is preferred for the extra reliability.
44 |
45 | Clone the xrptoolkit-nodejs repository and install dependencies
46 |
47 | ```
48 | $ git clone https://github.com/Duke67/xrptoolkit-nodejs xrptoolkit
49 | $ cd xrptoolkit
50 | $ yarn install
51 | ```
52 |
53 | Test your installation:
54 |
55 | ```
56 | $ node new
57 | ```
58 |
59 | You should see something like this:
60 |
61 | ```
62 | user@host:~/xrptoolkit$ node new
63 | Ripple Account : ryH1ckEKUm4yeLTziToAltWYtsrYSV4Po
64 | Ripple Secret : ss467Gz1g5YikcCxHePFShkoZBPzr
65 | user@host:~/xrptoolkit$
66 | ```
67 |
68 | Now test the QR version of the script to check if internal web server and QR code generation works:
69 |
70 | ```
71 | $ node newQR
72 | ```
73 |
74 | Now your web browser should open and display something like this:
75 |
76 | 
77 |
78 |
79 | # Installation (Offline computer)
80 | - Make a fresh Linux installation (Ubuntu 16+ or similar)
81 | - Copy here complete “xrptoolkit-nodejs” folder including its subfolders from the online computer
82 | - Never connect this computer to the Internet (i.e. disable WiFi in BIOS, or switch network button off)
83 |
84 |
85 | # Configurations
86 | - Linux (online) – Linux (offline)
87 | - Android (online) – Linux (offline)
88 | - Linux (online)
89 |
90 |
91 | # Usage
92 |
93 |
94 | ### Create New Account
95 | ```
96 | $ node new
97 | ```
98 | - You will see Ripple Account and Secret in console (terminal)
99 | - Save to a secure location for future use
100 | - Hint: Do some work before this, to give the OS a chance to collect some entropy. Never create accounts immediately after the system boots up!
101 |
102 |
103 |
104 | ### Create New Account (QR code)
105 | ```
106 | $ node newQR
107 | ```
108 | - You will see Ripple Account and Secret in web browser
109 | - Save text and QRcode images to a secure location for future use
110 | - Hint: Do some work before this, to give the OS a chance to collect some entropy. Never create accounts immediately after the system boots up!
111 |
112 |
113 |
114 | ### Check Account Information
115 | ```
116 | $ node account_info [RCL|TEST] account
117 | ```
118 | - Use RCL or TEST parameter to select production or test network
119 | - You will see account’s Balance (in XRP, not drops) and Sequence in console
120 |
121 | ```
122 | $ node account_info RCL rAAAAAAAAAAAAAAAAAAAAAAACNT
123 | Balance : 22500
124 | Sequence: 7
125 | ```
126 |
127 |
128 | ### Check Server Information
129 | ```
130 | $ node server_info [RCL|TEST]
131 | ```
132 | - Use RCL or TEST parameter to select production or test network
133 | - You will see a complex JSON-formatted server information
134 | - Hint: parameter "ledgerVersion" in section "validatedLedger" is used when signing offline transactions
135 |
136 |
137 | ### Check Stash
138 | ```
139 | $ node check_stash
140 | ```
141 | - Use text editor to preset array of variables with your accounts list
142 | - You will see accounts complete balances, including non-XRP assets
143 |
144 |
145 | ### Sign Payment
146 | ```
147 | $ node sign SRC SECRET SEQ DST DSTTAG AMOUNT MAXLEDGER
148 | ```
149 | - Before signing payment offline, you will need to know:
150 | - source account
151 | - source account’s secret
152 | - source sequence (use Android client, or account_info)
153 | - destination address
154 | - destination tag (can be ignored, if not required by receipient)
155 | - maximum ledger (use Android client, or server_info and adjust accordingly)-
156 | - Payment amount is in drops (1,000,000 drops = 1 XRP)
157 |
158 | - Hints:
159 | - Use text editor to preset default variables with your own data
160 | - You may want to create custom copies of this script for frequent payments
161 | - New ledger is closed every 3-4 seconds. If you will need 1-2 minutes to submit this payment to live network, better add 20-50 or even more to what is reported by server_info.
162 |
163 | - You will see JSON-formatted payment details and then signed transaction’s text blob
164 | - Transfer signed transaction to online device (computer or Android client) for submission to Ripple network
165 |
166 | ```
167 | $ node sign raakAtsGGZGGs8xb8AxDEUyWj7UxNGHGb7 shkJ3HM8jcrKvpYAifJhwvkaGDEtm 16
168 | rGNLJ5VLZWKt7RrQrbyUZjXa2mCCcEenpu 1967 25000000 35000000
169 |
170 | {"TransactionType":"Payment","Account":"raakAtsGGZGGs8xb8AxDEUyWj7UxNGHGb7",
171 | "Destination":"rGNLJ5VLZWKt7RrQrbyUZjXa2mCCcEenpu","DestinationTag":"1967","Amount":"25000000",
172 | "Flags":2147483648,"LastLedgerSequence":35000000,"Fee":"12","Sequence":16}
173 |
174 | SIGNED TX:
175 |
176 | 120000228000000024000000102E000007AF201B02160EC06140000000017D784068400000000000000C7321022CC705F
177 | 4FEE39CEFE883FE86853EF866EF26764AC31362AAD37E6573F8CFE9E074473045022100D2D6A554D11E55290F216A8FB9
178 | CC2921A498DC4FF357D480589F72550810A7CC02202BBB48C1342631BA514A307AF523C77CBD4406D19CEC69F0508187A
179 | 7BD7265F7811437EF64A707F99867C5E2B8DB5E902D9CD04158D28314A70F68DD4D41D95468A8E61BC32DE25862F63CA6
180 |
181 | $
182 | ```
183 |
184 |
185 | ### Sign Payment (QR code)
186 | ```
187 | $ node signQR SRC SECRET SEQ DST DSTTAG AMOUNT MAXLEDGER
188 | ```
189 | - Before signing payment offline, you will need to know:
190 | - source account
191 | - source account’s secret
192 | - source sequence (use Android client, or account_info)
193 | - destination address
194 | - destination tag (can be ignored, if not required by receipient)
195 | - maximum ledger (use Android client, or server_info and adjust accordingly)
196 | - Payment amount is in drops (1,000,000 drops = 1 XRP)
197 |
198 | - Hints:
199 | - Use text editor to preset default variables with your own data
200 | - You may want to create custom copies of this script for frequent payments
201 | - New ledger is closed every 3-4 seconds. If you will need 1-2 minutes to submit this payment to live network, better add 20-50 or even more to what is reported by server_info.
202 |
203 | - In a web browser you will see QR code and text blob representing signed transaction
204 | - Use Android client QR feature to scan and instantly submit transaction to Ripple network
205 |
206 |
207 | ### Submit
208 | ```
209 | $ node submit [RCL|TEST] SIGNED_TX
210 | ```
211 | - Use RCL or TEST parameter to select production or test network
212 | - Use sign or signQR to generate SIGNED_TX text blob
213 | - After a submission you will see a preliminary information on status
214 | - Final information about validation by the network can be obtained by monitoring the account or the transation
215 |
216 | ### Secret2address
217 | ```
218 | $ node secret2address [SECRET]
219 | ```
220 | - Extracts Ripple address (public) from Ripple secret (private)
221 | - If no secret is provided, it creates a new address
222 |
223 |
224 | ### Secret2addressQR
225 | ```
226 | $ node secret2addressQR [SECRET]
227 | ```
228 | - Extracts Ripple address (public) from Ripple secret (private)
229 | - Displays all data including QR codes in a web browser
230 | - If no secret is provided, it creates a new address
231 |
232 | ### Warp2account
233 | ```
234 | $ node warp2account [PASSWORD] [SALT]
235 | ```
236 | - Extracts Ripple address (public) and Ripple secret (private) from RippleWarpWallet Password and Salt
237 |
238 | ### Warp2accountQR
239 | ```
240 | $ node warp2accountQR [PASSWORD] [SALT]
241 | ```
242 | - Extracts Ripple address (public) and Ripple secret (private) from RippleWarpWallet Password and Salt
243 | - Displays all data including QR codes in a web browser
244 |
245 | ### ShowQR
246 | ```
247 | $ node showQR [ACCOUNT|SECRET]
248 | ```
249 | - Generates a QR code for a text provided
250 | - Display it in a web browser
251 |
252 |
253 | # Future development
254 | - Support for other crypto currencies, fiat and IOUs
255 | - Escrow
256 | - Multi-sign
257 | - iOS client for Apple iPhone
258 |
259 | # Release notes
260 | - 1.0.0 - initial release
261 | - 1.0.1 - improved web browser launching (QR scripts versions)
262 |
263 | # Contact
264 | - Follow [@MrDuke67 on twitter](https://twitter.com/MrDuke67)
265 |
266 |
267 | # License
268 | - (https://github.com/Duke67/xrptoolkit-nodejs/blob/master/LICENSE)
269 |
--------------------------------------------------------------------------------
/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | "@types/lodash@^4.14.85":
6 | version "4.14.102"
7 | resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.102.tgz#586a3e22385fc79b07cef9c5a1c8a5387986fbc8"
8 |
9 | "@types/node@*":
10 | version "9.4.5"
11 | resolved "https://registry.yarnpkg.com/@types/node/-/node-9.4.5.tgz#d2a90c634208173d1b1a0a6ba9f1df3de62edcf5"
12 |
13 | "@types/ws@^3.2.0":
14 | version "3.2.1"
15 | resolved "https://registry.yarnpkg.com/@types/ws/-/ws-3.2.1.tgz#b0c1579e58e686f83ce0a97bb9463d29705827fb"
16 | dependencies:
17 | "@types/node" "*"
18 |
19 | accepts@~1.3.4:
20 | version "1.3.4"
21 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f"
22 | dependencies:
23 | mime-types "~2.1.16"
24 | negotiator "0.6.1"
25 |
26 | agent-base@2:
27 | version "2.1.1"
28 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.1.1.tgz#d6de10d5af6132d5bd692427d46fc538539094c7"
29 | dependencies:
30 | extend "~3.0.0"
31 | semver "~5.0.1"
32 |
33 | ansi-regex@^2.0.0:
34 | version "2.1.1"
35 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
36 |
37 | ansi-regex@^3.0.0:
38 | version "3.0.0"
39 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
40 |
41 | array-flatten@1.1.1:
42 | version "1.1.1"
43 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
44 |
45 | async-limiter@~1.0.0:
46 | version "1.0.0"
47 | resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
48 |
49 | babel-runtime@^5.8.20:
50 | version "5.8.38"
51 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-5.8.38.tgz#1c0b02eb63312f5f087ff20450827b425c9d4c19"
52 | dependencies:
53 | core-js "^1.0.0"
54 |
55 | babel-runtime@^6.26.0, babel-runtime@^6.6.1:
56 | version "6.26.0"
57 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
58 | dependencies:
59 | core-js "^2.4.0"
60 | regenerator-runtime "^0.11.0"
61 |
62 | base-x@^1.0.1:
63 | version "1.1.0"
64 | resolved "https://registry.yarnpkg.com/base-x/-/base-x-1.1.0.tgz#42d3d717474f9ea02207f6d1aa1f426913eeb7ac"
65 |
66 | base64-js@0.0.8:
67 | version "0.0.8"
68 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978"
69 |
70 | bignumber.js@^4.1.0:
71 | version "4.1.0"
72 | resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-4.1.0.tgz#db6f14067c140bd46624815a7916c92d9b6c24b1"
73 |
74 | bn.js@^3.1.1:
75 | version "3.3.0"
76 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-3.3.0.tgz#1138e577889fdc97bbdab51844f2190dfc0ae3d7"
77 |
78 | bn.js@^4.11.3:
79 | version "4.11.8"
80 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
81 |
82 | body-parser@1.18.2:
83 | version "1.18.2"
84 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454"
85 | dependencies:
86 | bytes "3.0.0"
87 | content-type "~1.0.4"
88 | debug "2.6.9"
89 | depd "~1.1.1"
90 | http-errors "~1.6.2"
91 | iconv-lite "0.4.19"
92 | on-finished "~2.3.0"
93 | qs "6.5.1"
94 | raw-body "2.3.2"
95 | type-is "~1.6.15"
96 |
97 | brorand@^1.0.1, brorand@^1.0.5:
98 | version "1.1.0"
99 | resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
100 |
101 | browser-launcher3@^0.4.4:
102 | version "0.4.4"
103 | resolved "https://registry.yarnpkg.com/browser-launcher3/-/browser-launcher3-0.4.4.tgz#f990abac4c97119f294046aba344cae8b6da452b"
104 | dependencies:
105 | uid "0.0.2"
106 | headless "^0.1.7"
107 | lodash "^2.4.1"
108 | mkdirp "^0.5.0"
109 | osenv "^0.1.0"
110 | plist "^1.0.1"
111 | rimraf "~2.2.8"
112 | win-detect-browsers "^0.0.2"
113 |
114 | builtin-modules@^1.0.0:
115 | version "1.1.1"
116 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
117 |
118 | bytes@3.0.0:
119 | version "3.0.0"
120 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
121 |
122 | camelcase@^4.1.0:
123 | version "4.1.0"
124 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
125 |
126 | can-promise@^0.0.1:
127 | version "0.0.1"
128 | resolved "https://registry.yarnpkg.com/can-promise/-/can-promise-0.0.1.tgz#7a7597ad801fb14c8b22341dfec314b6bd6ad8d3"
129 | dependencies:
130 | window-or-global "^1.0.1"
131 |
132 | cipher-base@^1.0.1:
133 | version "1.0.4"
134 | resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
135 | dependencies:
136 | inherits "^2.0.1"
137 | safe-buffer "^5.0.1"
138 |
139 | cliui@^3.2.0:
140 | version "3.2.0"
141 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
142 | dependencies:
143 | string-width "^1.0.1"
144 | strip-ansi "^3.0.1"
145 | wrap-ansi "^2.0.0"
146 |
147 | code-point-at@^1.0.0:
148 | version "1.1.0"
149 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
150 |
151 | content-disposition@0.5.2:
152 | version "0.5.2"
153 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
154 |
155 | content-type@~1.0.4:
156 | version "1.0.4"
157 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
158 |
159 | cookie-signature@1.0.6:
160 | version "1.0.6"
161 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
162 |
163 | cookie@0.3.1:
164 | version "0.3.1"
165 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
166 |
167 | core-js@^1.0.0:
168 | version "1.2.7"
169 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
170 |
171 | core-js@^2.4.0:
172 | version "2.5.3"
173 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e"
174 |
175 | create-hash@^1.1.2:
176 | version "1.1.3"
177 | resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd"
178 | dependencies:
179 | cipher-base "^1.0.1"
180 | inherits "^2.0.1"
181 | ripemd160 "^2.0.0"
182 | sha.js "^2.4.0"
183 |
184 | cross-spawn@^5.0.1:
185 | version "5.1.0"
186 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
187 | dependencies:
188 | lru-cache "^4.0.1"
189 | shebang-command "^1.2.0"
190 | which "^1.2.9"
191 |
192 | debug@2, debug@2.6.9:
193 | version "2.6.9"
194 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
195 | dependencies:
196 | ms "2.0.0"
197 |
198 | decamelize@^1.1.1:
199 | version "1.2.0"
200 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
201 |
202 | decimal.js@^5.0.8:
203 | version "5.0.8"
204 | resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-5.0.8.tgz#b48c3fb7d73a2d4d4940e0b38f1cd21db5b367ce"
205 |
206 | depd@1.1.1:
207 | version "1.1.1"
208 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
209 |
210 | depd@~1.1.1:
211 | version "1.1.2"
212 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
213 |
214 | destroy@~1.0.4:
215 | version "1.0.4"
216 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
217 |
218 | dijkstrajs@^1.0.1:
219 | version "1.0.1"
220 | resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.1.tgz#d3cd81221e3ea40742cfcde556d4e99e98ddc71b"
221 |
222 | ee-first@1.1.1:
223 | version "1.1.1"
224 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
225 |
226 | elliptic@^5.1.0:
227 | version "5.2.1"
228 | resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-5.2.1.tgz#fa294b6563c6ddbc9ba3dc8594687ae840858f10"
229 | dependencies:
230 | bn.js "^3.1.1"
231 | brorand "^1.0.1"
232 | hash.js "^1.0.0"
233 | inherits "^2.0.1"
234 |
235 | encodeurl@~1.0.1:
236 | version "1.0.2"
237 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
238 |
239 | error-ex@^1.2.0:
240 | version "1.3.1"
241 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
242 | dependencies:
243 | is-arrayish "^0.2.1"
244 |
245 | escape-html@~1.0.3:
246 | version "1.0.3"
247 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
248 |
249 | etag@~1.8.1:
250 | version "1.8.1"
251 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
252 |
253 | execa@^0.7.0:
254 | version "0.7.0"
255 | resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
256 | dependencies:
257 | cross-spawn "^5.0.1"
258 | get-stream "^3.0.0"
259 | is-stream "^1.1.0"
260 | npm-run-path "^2.0.0"
261 | p-finally "^1.0.0"
262 | signal-exit "^3.0.0"
263 | strip-eof "^1.0.0"
264 |
265 | express@^4.16.2:
266 | version "4.16.2"
267 | resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c"
268 | dependencies:
269 | accepts "~1.3.4"
270 | array-flatten "1.1.1"
271 | body-parser "1.18.2"
272 | content-disposition "0.5.2"
273 | content-type "~1.0.4"
274 | cookie "0.3.1"
275 | cookie-signature "1.0.6"
276 | debug "2.6.9"
277 | depd "~1.1.1"
278 | encodeurl "~1.0.1"
279 | escape-html "~1.0.3"
280 | etag "~1.8.1"
281 | finalhandler "1.1.0"
282 | fresh "0.5.2"
283 | merge-descriptors "1.0.1"
284 | methods "~1.1.2"
285 | on-finished "~2.3.0"
286 | parseurl "~1.3.2"
287 | path-to-regexp "0.1.7"
288 | proxy-addr "~2.0.2"
289 | qs "6.5.1"
290 | range-parser "~1.2.0"
291 | safe-buffer "5.1.1"
292 | send "0.16.1"
293 | serve-static "1.13.1"
294 | setprototypeof "1.1.0"
295 | statuses "~1.3.1"
296 | type-is "~1.6.15"
297 | utils-merge "1.0.1"
298 | vary "~1.1.2"
299 |
300 | extend@3, extend@~3.0.0:
301 | version "3.0.1"
302 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
303 |
304 | finalhandler@1.1.0:
305 | version "1.1.0"
306 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5"
307 | dependencies:
308 | debug "2.6.9"
309 | encodeurl "~1.0.1"
310 | escape-html "~1.0.3"
311 | on-finished "~2.3.0"
312 | parseurl "~1.3.2"
313 | statuses "~1.3.1"
314 | unpipe "~1.0.0"
315 |
316 | find-up@^2.0.0:
317 | version "2.1.0"
318 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
319 | dependencies:
320 | locate-path "^2.0.0"
321 |
322 | forwarded@~0.1.2:
323 | version "0.1.2"
324 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
325 |
326 | fresh@0.5.2:
327 | version "0.5.2"
328 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
329 |
330 | get-caller-file@^1.0.1:
331 | version "1.0.2"
332 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
333 |
334 | get-stream@^3.0.0:
335 | version "3.0.0"
336 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
337 |
338 | graceful-fs@^4.1.2:
339 | version "4.1.11"
340 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
341 |
342 | hash-base@^2.0.0:
343 | version "2.0.2"
344 | resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1"
345 | dependencies:
346 | inherits "^2.0.1"
347 |
348 | hash.js@^1.0.0, hash.js@^1.0.3:
349 | version "1.1.3"
350 | resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846"
351 | dependencies:
352 | inherits "^2.0.3"
353 | minimalistic-assert "^1.0.0"
354 |
355 | headless@^0.1.7:
356 | version "0.1.7"
357 | resolved "https://registry.yarnpkg.com/headless/-/headless-0.1.7.tgz#6e62fae668947f88184d5c156ede7c5695a7e9c8"
358 |
359 | hosted-git-info@^2.1.4:
360 | version "2.5.0"
361 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c"
362 |
363 | http-errors@1.6.2, http-errors@~1.6.2:
364 | version "1.6.2"
365 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736"
366 | dependencies:
367 | depd "1.1.1"
368 | inherits "2.0.3"
369 | setprototypeof "1.0.3"
370 | statuses ">= 1.3.1 < 2"
371 |
372 | https-proxy-agent@^1.0.0:
373 | version "1.0.0"
374 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz#35f7da6c48ce4ddbfa264891ac593ee5ff8671e6"
375 | dependencies:
376 | agent-base "2"
377 | debug "2"
378 | extend "3"
379 |
380 | iced-error@~0.0.6:
381 | version "0.0.12"
382 | resolved "https://registry.yarnpkg.com/iced-error/-/iced-error-0.0.12.tgz#e0a861462817cf0ce974b13fca612d3a0d5d10be"
383 |
384 | iced-runtime@>=0.0.1:
385 | version "1.0.3"
386 | resolved "https://registry.yarnpkg.com/iced-runtime/-/iced-runtime-1.0.3.tgz#2d4f4fb999ab7aa5430b193c77a7fce4118319ce"
387 |
388 | iconv-lite@0.4.19:
389 | version "0.4.19"
390 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
391 |
392 | inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3:
393 | version "2.0.3"
394 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
395 |
396 | invert-kv@^1.0.0:
397 | version "1.0.0"
398 | resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
399 |
400 | ipaddr.js@1.5.2:
401 | version "1.5.2"
402 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0"
403 |
404 | is-arrayish@^0.2.1:
405 | version "0.2.1"
406 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
407 |
408 | is-builtin-module@^1.0.0:
409 | version "1.0.0"
410 | resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
411 | dependencies:
412 | builtin-modules "^1.0.0"
413 |
414 | is-fullwidth-code-point@^1.0.0:
415 | version "1.0.0"
416 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
417 | dependencies:
418 | number-is-nan "^1.0.0"
419 |
420 | is-fullwidth-code-point@^2.0.0:
421 | version "2.0.0"
422 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
423 |
424 | is-stream@^1.1.0:
425 | version "1.1.0"
426 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
427 |
428 | isarray@^2.0.1:
429 | version "2.0.4"
430 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.4.tgz#38e7bcbb0f3ba1b7933c86ba1894ddfc3781bbb7"
431 |
432 | isexe@^2.0.0:
433 | version "2.0.0"
434 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
435 |
436 | jsonschema@^1.1.1:
437 | version "1.2.2"
438 | resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.2.2.tgz#83ab9c63d65bf4d596f91d81195e78772f6452bc"
439 |
440 | launch-browser@^1.0.0:
441 | version "1.0.0"
442 | resolved "https://registry.yarnpkg.com/launch-browser/-/launch-browser-1.0.0.tgz#75be35f7f0496d56a09e88f27a988932bcba23da"
443 | dependencies:
444 | browser-launcher3 "^0.4.4"
445 |
446 | lcid@^1.0.0:
447 | version "1.0.0"
448 | resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
449 | dependencies:
450 | invert-kv "^1.0.0"
451 |
452 | load-json-file@^2.0.0:
453 | version "2.0.0"
454 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
455 | dependencies:
456 | graceful-fs "^4.1.2"
457 | parse-json "^2.2.0"
458 | pify "^2.0.0"
459 | strip-bom "^3.0.0"
460 |
461 | locate-path@^2.0.0:
462 | version "2.0.0"
463 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
464 | dependencies:
465 | p-locate "^2.0.0"
466 | path-exists "^3.0.0"
467 |
468 | lodash@^2.4.1:
469 | version "2.4.2"
470 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e"
471 |
472 | lodash@^3.5.0:
473 | version "3.10.1"
474 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
475 |
476 | lodash@^4.12.0, lodash@^4.17.4:
477 | version "4.17.5"
478 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511"
479 |
480 | lru-cache@^4.0.1:
481 | version "4.1.1"
482 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55"
483 | dependencies:
484 | pseudomap "^1.0.2"
485 | yallist "^2.1.2"
486 |
487 | media-typer@0.3.0:
488 | version "0.3.0"
489 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
490 |
491 | mem@^1.1.0:
492 | version "1.1.0"
493 | resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
494 | dependencies:
495 | mimic-fn "^1.0.0"
496 |
497 | merge-descriptors@1.0.1:
498 | version "1.0.1"
499 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
500 |
501 | methods@~1.1.2:
502 | version "1.1.2"
503 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
504 |
505 | mime-db@~1.30.0:
506 | version "1.30.0"
507 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01"
508 |
509 | mime-types@~2.1.15, mime-types@~2.1.16:
510 | version "2.1.17"
511 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a"
512 | dependencies:
513 | mime-db "~1.30.0"
514 |
515 | mime@1.4.1:
516 | version "1.4.1"
517 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
518 |
519 | mimic-fn@^1.0.0:
520 | version "1.2.0"
521 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
522 |
523 | minimalistic-assert@^1.0.0:
524 | version "1.0.0"
525 | resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3"
526 |
527 | minimist@0.0.8:
528 | version "0.0.8"
529 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
530 |
531 | mkdirp@^0.5.0:
532 | version "0.5.1"
533 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
534 | dependencies:
535 | minimist "0.0.8"
536 |
537 | more-entropy@~0.0.2:
538 | version "0.0.7"
539 | resolved "https://registry.yarnpkg.com/more-entropy/-/more-entropy-0.0.7.tgz#67bfc6f7a86f26fbc37aac83fd46d88c61d109b5"
540 | dependencies:
541 | iced-runtime ">=0.0.1"
542 |
543 | ms@2.0.0:
544 | version "2.0.0"
545 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
546 |
547 | negotiator@0.6.1:
548 | version "0.6.1"
549 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
550 |
551 | normalize-package-data@^2.3.2:
552 | version "2.4.0"
553 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
554 | dependencies:
555 | hosted-git-info "^2.1.4"
556 | is-builtin-module "^1.0.0"
557 | semver "2 || 3 || 4 || 5"
558 | validate-npm-package-license "^3.0.1"
559 |
560 | npm-run-path@^2.0.0:
561 | version "2.0.2"
562 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
563 | dependencies:
564 | path-key "^2.0.0"
565 |
566 | number-is-nan@^1.0.0:
567 | version "1.0.1"
568 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
569 |
570 | on-finished@~2.3.0:
571 | version "2.3.0"
572 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
573 | dependencies:
574 | ee-first "1.1.1"
575 |
576 | os-homedir@^1.0.0:
577 | version "1.0.2"
578 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
579 |
580 | os-locale@^2.0.0:
581 | version "2.1.0"
582 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
583 | dependencies:
584 | execa "^0.7.0"
585 | lcid "^1.0.0"
586 | mem "^1.1.0"
587 |
588 | os-tmpdir@^1.0.0:
589 | version "1.0.2"
590 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
591 |
592 | osenv@^0.1.0:
593 | version "0.1.4"
594 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644"
595 | dependencies:
596 | os-homedir "^1.0.0"
597 | os-tmpdir "^1.0.0"
598 |
599 | p-finally@^1.0.0:
600 | version "1.0.0"
601 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
602 |
603 | p-limit@^1.1.0:
604 | version "1.2.0"
605 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c"
606 | dependencies:
607 | p-try "^1.0.0"
608 |
609 | p-locate@^2.0.0:
610 | version "2.0.0"
611 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
612 | dependencies:
613 | p-limit "^1.1.0"
614 |
615 | p-try@^1.0.0:
616 | version "1.0.0"
617 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
618 |
619 | parse-json@^2.2.0:
620 | version "2.2.0"
621 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
622 | dependencies:
623 | error-ex "^1.2.0"
624 |
625 | parseurl@~1.3.2:
626 | version "1.3.2"
627 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
628 |
629 | path-exists@^3.0.0:
630 | version "3.0.0"
631 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
632 |
633 | path-key@^2.0.0:
634 | version "2.0.1"
635 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
636 |
637 | path-to-regexp@0.1.7:
638 | version "0.1.7"
639 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
640 |
641 | path-type@^2.0.0:
642 | version "2.0.0"
643 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
644 | dependencies:
645 | pify "^2.0.0"
646 |
647 | pify@^2.0.0:
648 | version "2.3.0"
649 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
650 |
651 | plist@^1.0.1:
652 | version "1.2.0"
653 | resolved "https://registry.yarnpkg.com/plist/-/plist-1.2.0.tgz#084b5093ddc92506e259f874b8d9b1afb8c79593"
654 | dependencies:
655 | base64-js "0.0.8"
656 | util-deprecate "1.0.2"
657 | xmlbuilder "4.0.0"
658 | xmldom "0.1.x"
659 |
660 | pngjs@^3.3.0:
661 | version "3.3.1"
662 | resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.3.1.tgz#8e14e6679ee7424b544334c3b2d21cea6d8c209a"
663 |
664 | progress@^2.0.0:
665 | version "2.0.0"
666 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f"
667 |
668 | progress@~1.1.2:
669 | version "1.1.8"
670 | resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be"
671 |
672 | proxy-addr@~2.0.2:
673 | version "2.0.2"
674 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec"
675 | dependencies:
676 | forwarded "~0.1.2"
677 | ipaddr.js "1.5.2"
678 |
679 | pseudomap@^1.0.2:
680 | version "1.0.2"
681 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
682 |
683 | qrcode@^1.2.0:
684 | version "1.2.0"
685 | resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.2.0.tgz#330d24313fbf8d429a806091af9525250239e44a"
686 | dependencies:
687 | can-promise "^0.0.1"
688 | dijkstrajs "^1.0.1"
689 | isarray "^2.0.1"
690 | pngjs "^3.3.0"
691 | yargs "^8.0.2"
692 |
693 | qs@6.5.1:
694 | version "6.5.1"
695 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
696 |
697 | range-parser@~1.2.0:
698 | version "1.2.0"
699 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
700 |
701 | raw-body@2.3.2:
702 | version "2.3.2"
703 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89"
704 | dependencies:
705 | bytes "3.0.0"
706 | http-errors "1.6.2"
707 | iconv-lite "0.4.19"
708 | unpipe "1.0.0"
709 |
710 | read-pkg-up@^2.0.0:
711 | version "2.0.0"
712 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
713 | dependencies:
714 | find-up "^2.0.0"
715 | read-pkg "^2.0.0"
716 |
717 | read-pkg@^2.0.0:
718 | version "2.0.0"
719 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
720 | dependencies:
721 | load-json-file "^2.0.0"
722 | normalize-package-data "^2.3.2"
723 | path-type "^2.0.0"
724 |
725 | regenerator-runtime@^0.11.0:
726 | version "0.11.1"
727 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
728 |
729 | require-directory@^2.1.1:
730 | version "2.1.1"
731 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
732 |
733 | require-main-filename@^1.0.1:
734 | version "1.0.1"
735 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
736 |
737 | rimraf@~2.2.8:
738 | version "2.2.8"
739 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582"
740 |
741 | ripemd160@^2.0.0:
742 | version "2.0.1"
743 | resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7"
744 | dependencies:
745 | hash-base "^2.0.0"
746 | inherits "^2.0.1"
747 |
748 | ripple-address-codec@^2.0.1:
749 | version "2.0.1"
750 | resolved "https://registry.yarnpkg.com/ripple-address-codec/-/ripple-address-codec-2.0.1.tgz#eddbe3a7960d2e02c5c1c74fb9a9fa0d2dfb6571"
751 | dependencies:
752 | hash.js "^1.0.3"
753 | x-address-codec "^0.7.0"
754 |
755 | ripple-binary-codec@^0.1.0, ripple-binary-codec@^0.1.10:
756 | version "0.1.12"
757 | resolved "https://registry.yarnpkg.com/ripple-binary-codec/-/ripple-binary-codec-0.1.12.tgz#30fb61a8d5bf61301899616c6f842e393082e385"
758 | dependencies:
759 | babel-runtime "^6.6.1"
760 | bn.js "^4.11.3"
761 | create-hash "^1.1.2"
762 | decimal.js "^5.0.8"
763 | inherits "^2.0.1"
764 | lodash "^4.12.0"
765 | ripple-address-codec "^2.0.1"
766 |
767 | ripple-hashes@^0.3.1:
768 | version "0.3.1"
769 | resolved "https://registry.yarnpkg.com/ripple-hashes/-/ripple-hashes-0.3.1.tgz#f2f46f1ff05e6487500a99839019114cd2482411"
770 | dependencies:
771 | bignumber.js "^4.1.0"
772 | create-hash "^1.1.2"
773 | ripple-address-codec "^2.0.1"
774 | ripple-binary-codec "^0.1.0"
775 |
776 | ripple-keypairs@0.10.1, ripple-keypairs@^0.10.1:
777 | version "0.10.1"
778 | resolved "https://registry.yarnpkg.com/ripple-keypairs/-/ripple-keypairs-0.10.1.tgz#ef796b519bb202682515e7cdd6063762636943e6"
779 | dependencies:
780 | babel-runtime "^5.8.20"
781 | bn.js "^3.1.1"
782 | brorand "^1.0.5"
783 | elliptic "^5.1.0"
784 | hash.js "^1.0.3"
785 | ripple-address-codec "^2.0.1"
786 |
787 | ripple-lib-transactionparser@^0.6.2:
788 | version "0.6.2"
789 | resolved "https://registry.yarnpkg.com/ripple-lib-transactionparser/-/ripple-lib-transactionparser-0.6.2.tgz#eb117834816cab3398445a74ec3cacec95b6b5fa"
790 | dependencies:
791 | bignumber.js "^4.1.0"
792 | lodash "^4.17.4"
793 |
794 | ripple-lib@^0.18.1:
795 | version "0.18.1"
796 | resolved "https://registry.yarnpkg.com/ripple-lib/-/ripple-lib-0.18.1.tgz#0e79efe20660c29016408107044cfc0801c56846"
797 | dependencies:
798 | "@types/lodash" "^4.14.85"
799 | "@types/ws" "^3.2.0"
800 | bignumber.js "^4.1.0"
801 | https-proxy-agent "^1.0.0"
802 | jsonschema "^1.1.1"
803 | lodash "^4.17.4"
804 | ripple-address-codec "^2.0.1"
805 | ripple-binary-codec "^0.1.10"
806 | ripple-hashes "^0.3.1"
807 | ripple-keypairs "^0.10.1"
808 | ripple-lib-transactionparser "^0.6.2"
809 | ws "^3.3.1"
810 |
811 | ripplewarpwallet@^1.0.4:
812 | version "1.0.4"
813 | resolved "https://registry.yarnpkg.com/ripplewarpwallet/-/ripplewarpwallet-1.0.4.tgz#096acef291e81310ed1e9e121c314a42fc3e9273"
814 | dependencies:
815 | babel-runtime "^6.26.0"
816 | ripple-keypairs "0.10.1"
817 | triplesec keybase/triplesec#header_v3
818 |
819 | safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@~5.1.0:
820 | version "5.1.1"
821 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
822 |
823 | "semver@2 || 3 || 4 || 5":
824 | version "5.5.0"
825 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
826 |
827 | semver@~5.0.1:
828 | version "5.0.3"
829 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a"
830 |
831 | send@0.16.1:
832 | version "0.16.1"
833 | resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3"
834 | dependencies:
835 | debug "2.6.9"
836 | depd "~1.1.1"
837 | destroy "~1.0.4"
838 | encodeurl "~1.0.1"
839 | escape-html "~1.0.3"
840 | etag "~1.8.1"
841 | fresh "0.5.2"
842 | http-errors "~1.6.2"
843 | mime "1.4.1"
844 | ms "2.0.0"
845 | on-finished "~2.3.0"
846 | range-parser "~1.2.0"
847 | statuses "~1.3.1"
848 |
849 | serve-static@1.13.1:
850 | version "1.13.1"
851 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719"
852 | dependencies:
853 | encodeurl "~1.0.1"
854 | escape-html "~1.0.3"
855 | parseurl "~1.3.2"
856 | send "0.16.1"
857 |
858 | set-blocking@^2.0.0:
859 | version "2.0.0"
860 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
861 |
862 | setprototypeof@1.0.3:
863 | version "1.0.3"
864 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04"
865 |
866 | setprototypeof@1.1.0:
867 | version "1.1.0"
868 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
869 |
870 | sha.js@^2.4.0:
871 | version "2.4.10"
872 | resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.10.tgz#b1fde5cd7d11a5626638a07c604ab909cfa31f9b"
873 | dependencies:
874 | inherits "^2.0.1"
875 | safe-buffer "^5.0.1"
876 |
877 | shebang-command@^1.2.0:
878 | version "1.2.0"
879 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
880 | dependencies:
881 | shebang-regex "^1.0.0"
882 |
883 | shebang-regex@^1.0.0:
884 | version "1.0.0"
885 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
886 |
887 | signal-exit@^3.0.0:
888 | version "3.0.2"
889 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
890 |
891 | spdx-correct@~1.0.0:
892 | version "1.0.2"
893 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40"
894 | dependencies:
895 | spdx-license-ids "^1.0.2"
896 |
897 | spdx-expression-parse@~1.0.0:
898 | version "1.0.4"
899 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c"
900 |
901 | spdx-license-ids@^1.0.2:
902 | version "1.2.2"
903 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57"
904 |
905 | "statuses@>= 1.3.1 < 2":
906 | version "1.4.0"
907 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
908 |
909 | statuses@~1.3.1:
910 | version "1.3.1"
911 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
912 |
913 | string-width@^1.0.1:
914 | version "1.0.2"
915 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
916 | dependencies:
917 | code-point-at "^1.0.0"
918 | is-fullwidth-code-point "^1.0.0"
919 | strip-ansi "^3.0.0"
920 |
921 | string-width@^2.0.0:
922 | version "2.1.1"
923 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
924 | dependencies:
925 | is-fullwidth-code-point "^2.0.0"
926 | strip-ansi "^4.0.0"
927 |
928 | strip-ansi@^3.0.0, strip-ansi@^3.0.1:
929 | version "3.0.1"
930 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
931 | dependencies:
932 | ansi-regex "^2.0.0"
933 |
934 | strip-ansi@^4.0.0:
935 | version "4.0.0"
936 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
937 | dependencies:
938 | ansi-regex "^3.0.0"
939 |
940 | strip-bom@^3.0.0:
941 | version "3.0.0"
942 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
943 |
944 | strip-eof@^1.0.0:
945 | version "1.0.0"
946 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
947 |
948 | "triplesec@github:keybase/triplesec#header_v3":
949 | version "1.3.0"
950 | resolved "https://codeload.github.com/keybase/triplesec/tar.gz/cea95ec82c7412008ecee65a5fd782c44bc3bf51"
951 | dependencies:
952 | iced-error "~0.0.6"
953 | more-entropy "~0.0.2"
954 | progress "~1.1.2"
955 |
956 | type-is@~1.6.15:
957 | version "1.6.15"
958 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410"
959 | dependencies:
960 | media-typer "0.3.0"
961 | mime-types "~2.1.15"
962 |
963 | uid@0.0.2:
964 | version "0.0.2"
965 | resolved "https://registry.yarnpkg.com/uid/-/uid-0.0.2.tgz#5e4a5d4b78138b4f70f89fd3c76fc59aa9d2f103"
966 |
967 | ultron@~1.1.0:
968 | version "1.1.1"
969 | resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
970 |
971 | unpipe@1.0.0, unpipe@~1.0.0:
972 | version "1.0.0"
973 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
974 |
975 | util-deprecate@1.0.2:
976 | version "1.0.2"
977 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
978 |
979 | utils-merge@1.0.1:
980 | version "1.0.1"
981 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
982 |
983 | validate-npm-package-license@^3.0.1:
984 | version "3.0.1"
985 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc"
986 | dependencies:
987 | spdx-correct "~1.0.0"
988 | spdx-expression-parse "~1.0.0"
989 |
990 | vary@~1.1.2:
991 | version "1.1.2"
992 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
993 |
994 | which-module@^2.0.0:
995 | version "2.0.0"
996 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
997 |
998 | which@^1.0.5, which@^1.2.9:
999 | version "1.3.0"
1000 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a"
1001 | dependencies:
1002 | isexe "^2.0.0"
1003 |
1004 | win-detect-browsers@^0.0.2:
1005 | version "0.0.2"
1006 | resolved "https://registry.yarnpkg.com/win-detect-browsers/-/win-detect-browsers-0.0.2.tgz#d636ade6434c9967c7e7af592a0b4aa2ba9d22f2"
1007 | dependencies:
1008 | which "^1.0.5"
1009 |
1010 | window-or-global@^1.0.1:
1011 | version "1.0.1"
1012 | resolved "https://registry.yarnpkg.com/window-or-global/-/window-or-global-1.0.1.tgz#dbe45ba2a291aabc56d62cf66c45b7fa322946de"
1013 |
1014 | wrap-ansi@^2.0.0:
1015 | version "2.1.0"
1016 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
1017 | dependencies:
1018 | string-width "^1.0.1"
1019 | strip-ansi "^3.0.1"
1020 |
1021 | ws@^3.3.1:
1022 | version "3.3.3"
1023 | resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2"
1024 | dependencies:
1025 | async-limiter "~1.0.0"
1026 | safe-buffer "~5.1.0"
1027 | ultron "~1.1.0"
1028 |
1029 | x-address-codec@^0.7.0:
1030 | version "0.7.2"
1031 | resolved "https://registry.yarnpkg.com/x-address-codec/-/x-address-codec-0.7.2.tgz#2a2f7bb00278520bd13733a7959a05443d6802e0"
1032 | dependencies:
1033 | base-x "^1.0.1"
1034 |
1035 | xmlbuilder@4.0.0:
1036 | version "4.0.0"
1037 | resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-4.0.0.tgz#98b8f651ca30aa624036f127d11cc66dc7b907a3"
1038 | dependencies:
1039 | lodash "^3.5.0"
1040 |
1041 | xmldom@0.1.x:
1042 | version "0.1.27"
1043 | resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9"
1044 |
1045 | y18n@^3.2.1:
1046 | version "3.2.1"
1047 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
1048 |
1049 | yallist@^2.1.2:
1050 | version "2.1.2"
1051 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
1052 |
1053 | yargs-parser@^7.0.0:
1054 | version "7.0.0"
1055 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"
1056 | dependencies:
1057 | camelcase "^4.1.0"
1058 |
1059 | yargs@^8.0.2:
1060 | version "8.0.2"
1061 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360"
1062 | dependencies:
1063 | camelcase "^4.1.0"
1064 | cliui "^3.2.0"
1065 | decamelize "^1.1.1"
1066 | get-caller-file "^1.0.1"
1067 | os-locale "^2.0.0"
1068 | read-pkg-up "^2.0.0"
1069 | require-directory "^2.1.1"
1070 | require-main-filename "^1.0.1"
1071 | set-blocking "^2.0.0"
1072 | string-width "^2.0.0"
1073 | which-module "^2.0.0"
1074 | y18n "^3.2.1"
1075 | yargs-parser "^7.0.0"
1076 |
--------------------------------------------------------------------------------