├── .gitignore ├── LICENSE ├── README.md ├── account_info.js ├── check_stash.js ├── delete.js ├── new.js ├── newQR.js ├── newQRimg.jpg ├── package.json ├── secret2address.js ├── secret2addressQR.js ├── server_info.js ├── showQR.js ├── sign.js ├── signQR.js ├── submit.js ├── warp2account.js ├── warp2accountQR.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | ![New Account with QR codes](newQRimg.jpg?raw=true "New Account with QR codes") 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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 += ""; 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 | -------------------------------------------------------------------------------- /newQRimg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Duke67/xrptoolkit-nodejs/fae7e21194247ffc3c5c130be492010fa7676066/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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 += ""; 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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 += "
"; 105 | 106 | html += "
"; 107 | html += "Source Account: " + src + "
"; 108 | html += "Source Account Sequence: " + seq + "
"; 109 | html += "Max Ledger: " + lgr + "
"; 110 | html += "
"; 111 | 112 | html += "
"; 113 | html += "Destination Account: " + dst + "
"; 114 | html += "Destination Tag: " + tag + "
"; 115 | html += "
"; 116 | 117 | html += "
"; 118 | html += "Amount: "; 119 | html += amnt + "
"; 120 | html += "Fee: "; 121 | html += fee + "
"; 122 | html += "
"; 123 | 124 | var opts = { 125 | errorCorrectionLevel: 'H', 126 | type: 'image/png', 127 | scale: 5 128 | }; 129 | 130 | html += "
"; 131 | 132 | qrcode.toDataURL(signedTx.signedTransaction, opts, function (err2, url) { 133 | 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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 += ""; 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 | -------------------------------------------------------------------------------- /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 | --------------------------------------------------------------------------------