├── .gitignore ├── .nojekyll ├── CNAME ├── LICENSE ├── MINERCRAFT.png ├── README.md ├── _coverpage.md ├── demo ├── bitsocket.html ├── feecalc.js ├── feerate.js ├── feeratecalc.js ├── feerateverbose.js ├── feevalidate.js ├── miners.json ├── push.js ├── test.js ├── txstatus.js ├── validate.js ├── verbosetxstatus.js └── webdemo.html ├── dist ├── minercraft.js └── minercraft.min.js ├── fee.js ├── index.html ├── index.js ├── mm.jpg ├── package-lock.json ├── package.json ├── poster.png ├── style.css ├── transaction.js ├── validate.js └── vue.css /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interplanaria/minercraft/63a28e1dbc9cc532685a1ebc27fe02dfc87d8644/.nojekyll -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | minercraft.network -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2020 Planaria corp. 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /MINERCRAFT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interplanaria/minercraft/63a28e1dbc9cc532685a1ebc27fe02dfc87d8644/MINERCRAFT.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Minercraft 2 | 3 | > Interact with Bitcoin miner APIs 4 | 5 | Minercraft is a JavaScript library for effortlessly interacting with Bitcoin Miner APIs. Currently supporting the [beta version of the Merchant API](https://bitcoinsv.io/2020/04/03/miner-id-and-merchant-api-beta-release/). 6 | 7 | Minercraft works both **on the server** as well as **inside a browser.** 8 | 9 | --- 10 | 11 | # What it does 12 | 13 | Miner merchant APIs must follow the BRFC spec at https://github.com/bitcoin-sv/merchantapi-reference 14 | 15 | 1. **Get fee rates** from a miner 16 | 2. **Calculate fee** from a raw transaction 17 | 3. **Query the status of a single transaction** 18 | 4. **Push a transaction** to a miner 19 | 20 | --- 21 | 22 | # Miners 23 | 24 | The bitcoin miners currently providing the merchant API beta endpoints are: 25 | 26 | - Matterpool: https://matterpool.io 27 | - Mempool: https://mempool.com 28 | - TAAL: https://taal.com 29 | - YOU CAN TOO! (Please give a heads up to [@_unwriter](https://twitter.com/_unwriter) when you implement the API) 30 | 31 | --- 32 | 33 | # install 34 | 35 | ## 1. In browser 36 | 37 | ``` 38 | 39 | ``` 40 | 41 | Check out an in-browser demo here: [Minercraft Browser Demo](https://minercraft.network/demo/webdemo.html) (Source code [here](https://github.com/interplanaria/minercraft/blob/master/demo/webdemo.html)) 42 | 43 | 44 | 45 | ## 2. In node.js 46 | 47 | ``` 48 | npm install --save minercraft 49 | ``` 50 | --- 51 | 52 | # API 53 | 54 | ## 0. Create a miner unit 55 | 56 | Initialize with a miner API (must follow the miner merchant API spec: https://github.com/bitcoin-sv-specs/brfc-merchantapi) 57 | 58 | Example: 59 | 60 | ```javascript 61 | const miner = new Minercraft({ 62 | url: "https://www.ddpurse.com/openapi", 63 | headers: { 64 | // The following token value is a "free trial" value. For more info visit https://developers.dotwallet.com/en/dev/api/merchant 65 | token: "561b756d12572020ea9a104c3441b71790acbbce95a6ddbf7e0630971af9424b" 66 | } 67 | }) 68 | ``` 69 | 70 | ### a. TAAL.com 71 | 72 | You can use the following config to connect to TAAL merchant API (Tentative): 73 | 74 | ```javascript 75 | const miner = new Minercraft({ 76 | "url": "https://merchantapi.taal.com" 77 | }) 78 | ``` 79 | 80 | ### b. Mempool.com 81 | 82 | You can use the following config to connect to Mempool.com merchant API (Tentative) using the beta token (free): 83 | 84 | ```javascript 85 | const miner = new Minercraft({ 86 | url: "https://www.ddpurse.com/openapi", 87 | headers: { 88 | // The following token value is a "free trial" value. For more info visit https://developers.dotwallet.com/en/dev/api/merchant 89 | token: "561b756d12572020ea9a104c3441b71790acbbce95a6ddbf7e0630971af9424b" 90 | } 91 | }) 92 | ``` 93 | 94 | ### c. Matterpool.io 95 | 96 | You can use the following config to connect to Matterpool.io merchant API: 97 | 98 | ```javascript 99 | const miner = new Minercraft({ 100 | url: "https://merchantapi.matterpool.io" 101 | }) 102 | ``` 103 | 104 | ## 1. Get the fee rate 105 | 106 | Query a miner's fee rate: 107 | 108 | ```javascript 109 | let rate = await miner.fee.rate() 110 | console.log("fee rate:", rate) 111 | ``` 112 | 113 | will print: 114 | 115 | ```json 116 | fee rate: { 117 | "valid": true, 118 | "expires": "2020-04-30T13:05:16.925Z", 119 | "mine": { "standard": 0.5, "data": 0.5 }, 120 | "relay": { "standard": 0.25, "data": 0.25 } 121 | } 122 | ``` 123 | 124 | You can also pass in an additional parameter `verbose: true` to get the raw response from the API, which includes other metadata such as minerID and signature, which you can use to verify authenticity: 125 | 126 | ```javascript 127 | let rate = await miner.fee.rate({ verbose: true }) 128 | console.log("verbose fee rate:", rate) 129 | ``` 130 | 131 | ## 2. Calculate fee for a transaction 132 | 133 | Calculate total fee, based on a fixed rate: 134 | 135 | ```javascript 136 | let fee = miner.fee.get({ 137 | rate: { data: 0.5, standard: 0.5 }, 138 | tx: "0100000001648ed7d1c1a27ec923445c8d404e227145218c4ce01cf958a898c5a048e8f264020000006a47304402207dc1953455be091c8df18e7f7e1424bc4efdced3e400642f8316e3ef298c3f30022062d833b3f1b94593ec7c088b930e2987475c7d99bf19f5714b12a9facff100df41210273f105be3e7ca116e96c7c40f17267ae05ede7160eb099aa2146a88b6328f4ecffffffff030000000000000000fdc901006a223144535869386876786e36506434546176686d544b7855374255715337636e7868770c57544458565633505a4b474414e5ae89e5bebd2fe585ade5ae892fe99c8de982b119323032302d30342d30365430363a30303a30302b30383a30304c697b22617169223a223538222c22706d3235223a223332222c22706d3130223a223636222c22736f32223a2235222c226e6f32223a223235222c22636f223a22302e373530222c226f33223a223635222c22706f6c223a22504d3130222c22717561223a22e889af227d4cfb78da75d1c16a02311006e077c959964cb29944dfa1d07bf1209e0a6b57b137114aaf2d2d5e446d7b29d59e3c492f22f834d9ea5b3859e826bba4b73fc34cf898b999b0dee89675184ad662c3815094a5293370ca1a298f73415151ba2b9370cdfd9c124f34c55c563fe419c5eb2b9aa5b1fb1e3d7edf66c5cf93fdfa2ed6072a66ae2621d15203775d99fb070013c50da7cab45599c09b04062688999437993f53d91933ade6a7f5d16e37e7e5676842307553aa1b2685c19e02137a93a94c92c74c69dc54bc7f9c173bfbf21882745b379784a60e0a0f071ea4fce1a45f521a399cfae770f6f0605f67f6795f0381688010dd1da7dd0b690c97db22020000000000001976a914666675d887a7ae09835af934096d9fcbbb70eed288ac61290000000000001976a9149e7520bc258934a3d58704ab98ed0200e2c1bb9688ac00000000" 139 | }) 140 | ``` 141 | 142 | First query the fee rate from a miner, and then use it to calcluate the total fee for a transaction: 143 | 144 | ```javascript 145 | let rate = await miner.fee.rate() 146 | let fee = miner.fee.get({ 147 | rate: rate.mine, // use the mining rate 148 | tx: "0100000001648ed7d1c1a27ec923445c8d404e227145218c4ce01cf958a898c5a048e8f264020000006a47304402207dc1953455be091c8df18e7f7e1424bc4efdced3e400642f8316e3ef298c3f30022062d833b3f1b94593ec7c088b930e2987475c7d99bf19f5714b12a9facff100df41210273f105be3e7ca116e96c7c40f17267ae05ede7160eb099aa2146a88b6328f4ecffffffff030000000000000000fdc901006a223144535869386876786e36506434546176686d544b7855374255715337636e7868770c57544458565633505a4b474414e5ae89e5bebd2fe585ade5ae892fe99c8de982b119323032302d30342d30365430363a30303a30302b30383a30304c697b22617169223a223538222c22706d3235223a223332222c22706d3130223a223636222c22736f32223a2235222c226e6f32223a223235222c22636f223a22302e373530222c226f33223a223635222c22706f6c223a22504d3130222c22717561223a22e889af227d4cfb78da75d1c16a02311006e077c959964cb29944dfa1d07bf1209e0a6b57b137114aaf2d2d5e446d7b29d59e3c492f22f834d9ea5b3859e826bba4b73fc34cf898b999b0dee89675184ad662c3815094a5293370ca1a298f73415151ba2b9370cdfd9c124f34c55c563fe419c5eb2b9aa5b1fb1e3d7edf66c5cf93fdfa2ed6072a66ae2621d15203775d99fb070013c50da7cab45599c09b04062688999437993f53d91933ade6a7f5d16e37e7e5676842307553aa1b2685c19e02137a93a94c92c74c69dc54bc7f9c173bfbf21882745b379784a60e0a0f071ea4fce1a45f521a399cfae770f6f0605f67f6795f0381688010dd1da7dd0b690c97db22020000000000001976a914666675d887a7ae09835af934096d9fcbbb70eed288ac61290000000000001976a9149e7520bc258934a3d58704ab98ed0200e2c1bb9688ac00000000" 149 | }) 150 | console.log("fee = ", fee) 151 | ``` 152 | 153 | will print: 154 | 155 | ``` 156 | fee = 348 157 | ``` 158 | 159 | ## 3. Get transaction status 160 | 161 | Query the miner to check what the status of a transaction is: 162 | 163 | ```javascript 164 | let status = miner.tx.status("e4763d71925c2ac11a4de0b971164b099dbdb67221f03756fc79708d53b8800e") 165 | console.log(status) 166 | ``` 167 | 168 | will print: 169 | 170 | ```json 171 | { 172 | "apiVersion": "0.1.0", 173 | "timestamp": "2020-04-15T19:51:51.020Z", 174 | "returnResult": "success", 175 | "resultDescription": "", 176 | "blockHash": "000000000000000004a5686ff15cdb3950939bdc5725970d963e2b03d3d43d45", 177 | "blockHeight": 630700, 178 | "confirmations": 50, 179 | "minerId": "03c51d59a737a0ebc064344bf206b7140bf51a9ef8d6cb75dc2d726853d7c76758", 180 | "txSecondMempoolExpiry": 0, 181 | "valid": true 182 | } 183 | ``` 184 | 185 | If you want to get a more detailed response, including the minerID and signature, you can call the method with `{verbose: true}`: 186 | 187 | ```javascript 188 | let status = await miner.tx.status(txid, { verbose: true }) 189 | console.log(status) 190 | ``` 191 | 192 | will print something like: 193 | 194 | ```json 195 | { 196 | "payload": { 197 | "apiVersion": "0.1.0", 198 | "timestamp": "2020-04-19T15:06:56.299Z", 199 | "returnResult": "success", 200 | "resultDescription": "", 201 | "blockHash": "000000000000000004a5686ff15cdb3950939bdc5725970d963e2b03d3d43d45", 202 | "blockHeight": 630700, 203 | "confirmations": 603, 204 | "minerId": "03e92d3e5c3f7bd945dfbf48e7a99393b1bfb3f11f380ae30d286e7ff2aec5a270", 205 | "txSecondMempoolExpiry": 0 206 | }, 207 | "signature": "3044022032eb418ea68a0825767fa6bf038cca200acbbbabeadd7f7e3b203594e3ef3ee60220224fc0657a5c7c8b3b4a8b71de897655a990b975ae9e9f8d574eb806663bc839", 208 | "publicKey": "03e92d3e5c3f7bd945dfbf48e7a99393b1bfb3f11f380ae30d286e7ff2aec5a270", 209 | "encoding": "UTF-8", 210 | "mimetype": "application/json", 211 | "valid": true 212 | } 213 | ``` 214 | 215 | 216 | ## 4. Push transaction 217 | 218 | Pass a raw transaction hex string into the `push()` function and it will send the transaction directly to the miner. 219 | 220 | ```javascript 221 | let response = await miner.tx.push("0100000001648ed7d1c1a27ec923445c8d404e227145218c4ce01cf958a898c5a048e8f264020000006a47304402207dc1953455be091c8df18e7f7e1424bc4efdced3e400642f8316e3ef298c3f30022062d833b3f1b94593ec7c088b930e2987475c7d99bf19f5714b12a9facff100df41210273f105be3e7ca116e96c7c40f17267ae05ede7160eb099aa2146a88b6328f4ecffffffff030000000000000000fdc901006a223144535869386876786e36506434546176686d544b7855374255715337636e7868770c57544458565633505a4b474414e5ae89e5bebd2fe585ade5ae892fe99c8de982b119323032302d30342d30365430363a30303a30302b30383a30304c697b22617169223a223538222c22706d3235223a223332222c22706d3130223a223636222c22736f32223a2235222c226e6f32223a223235222c22636f223a22302e373530222c226f33223a223635222c22706f6c223a22504d3130222c22717561223a22e889af227d4cfb78da75d1c16a02311006e077c959964cb29944dfa1d07bf1209e0a6b57b137114aaf2d2d5e446d7b29d59e3c492f22f834d9ea5b3859e826bba4b73fc34cf898b999b0dee89675184ad662c3815094a5293370ca1a298f73415151ba2b9370cdfd9c124f34c55c563fe419c5eb2b9aa5b1fb1e3d7edf66c5cf93fdfa2ed6072a66ae2621d15203775d99fb070013c50da7cab45599c09b04062688999437993f53d91933ade6a7f5d16e37e7e5676842307553aa1b2685c19e02137a93a94c92c74c69dc54bc7f9c173bfbf21882745b379784a60e0a0f071ea4fce1a45f521a399cfae770f6f0605f67f6795f0381688010dd1da7dd0b690c97db22020000000000001976a914666675d887a7ae09835af934096d9fcbbb70eed288ac61290000000000001976a9149e7520bc258934a3d58704ab98ed0200e2c1bb9688ac00000000") 222 | ``` 223 | 224 | Again, to get more verbose response, you can pass in `{ verbose: true }`: 225 | 226 | ```javascript 227 | let response = await miner.tx.push("0100000001648ed7d1c1a27ec923445c8d404e227145218c4ce01cf958a898c5a048e8f264020000006a47304402207dc1953455be091c8df18e7f7e1424bc4efdced3e400642f8316e3ef298c3f30022062d833b3f1b94593ec7c088b930e2987475c7d99bf19f5714b12a9facff100df41210273f105be3e7ca116e96c7c40f17267ae05ede7160eb099aa2146a88b6328f4ecffffffff030000000000000000fdc901006a223144535869386876786e36506434546176686d544b7855374255715337636e7868770c57544458565633505a4b474414e5ae89e5bebd2fe585ade5ae892fe99c8de982b119323032302d30342d30365430363a30303a30302b30383a30304c697b22617169223a223538222c22706d3235223a223332222c22706d3130223a223636222c22736f32223a2235222c226e6f32223a223235222c22636f223a22302e373530222c226f33223a223635222c22706f6c223a22504d3130222c22717561223a22e889af227d4cfb78da75d1c16a02311006e077c959964cb29944dfa1d07bf1209e0a6b57b137114aaf2d2d5e446d7b29d59e3c492f22f834d9ea5b3859e826bba4b73fc34cf898b999b0dee89675184ad662c3815094a5293370ca1a298f73415151ba2b9370cdfd9c124f34c55c563fe419c5eb2b9aa5b1fb1e3d7edf66c5cf93fdfa2ed6072a66ae2621d15203775d99fb070013c50da7cab45599c09b04062688999437993f53d91933ade6a7f5d16e37e7e5676842307553aa1b2685c19e02137a93a94c92c74c69dc54bc7f9c173bfbf21882745b379784a60e0a0f071ea4fce1a45f521a399cfae770f6f0605f67f6795f0381688010dd1da7dd0b690c97db22020000000000001976a914666675d887a7ae09835af934096d9fcbbb70eed288ac61290000000000001976a9149e7520bc258934a3d58704ab98ed0200e2c1bb9688ac00000000", { 228 | verbose: true 229 | }) 230 | ``` 231 | 232 | This will provide more information about the response. 233 | 234 | 235 | ## 5. Validate API responses 236 | 237 | Minercraft takes care of all the cryptographic validation of the API responses automatically. 238 | 239 | Note that every response contains a `"valid"` attribute which is either `true` or `false`. 240 | 241 | It will be true if the signature matches the publickey and the content. Otherwise it will be false. This is the same for both the normal mode and the verbose mode. Here are some examples: 242 | 243 | Normal Mode: 244 | 245 | ```json 246 | { 247 | "valid": true, 248 | "expires": "2020-04-30T13:05:16.525Z", 249 | "mine": { "standard": 0.5, "data": 0.5 }, 250 | "relay": { "standard": 0.25, "data": 0.25 } 251 | } 252 | ``` 253 | 254 | Verbose Mode: 255 | 256 | ```json 257 | { 258 | "payload": { 259 | "apiVersion": "0.1.0", 260 | "timestamp": "2020-04-30T12:55:26.581Z", 261 | "returnResult": "success", 262 | "resultDescription": "", 263 | "blockHash": "000000000000000004a5686ff15cdb3950939bdc5725970d963e2b03d3d43d45", 264 | "blockHeight": 630700, 265 | "confirmations": 2167, 266 | "minerId": "03c51d59a737a0ebc064344bf206b7140bf51a9ef8d6cb75dc2d726853d7c76758", 267 | "txSecondMempoolExpiry": 0 268 | }, 269 | "signature": "304402206a15cc626cb8e959aeb53eb4224cdd7150c56ae662ed236d7042265f21cbc8f802200bf97202bc0c09aae1f3993d28d4175ae24dd53225321c64cb9492c81f2ede03", 270 | "publicKey": "03c51d59a737a0ebc064344bf206b7140bf51a9ef8d6cb75dc2d726853d7c76758", 271 | "encoding": "UTF-8", 272 | "mimetype": "applicaton/json", 273 | "valid": true 274 | } 275 | ``` 276 | 277 | -------------------------------------------------------------------------------- /_coverpage.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | Interact with Bitcoin Miner APIs 4 | 5 | [GitHub](https://github.com/interplanaria/minercraft) 6 | [Get Started](#minercraft) 7 | 8 | ![](mm.jpg) 9 | -------------------------------------------------------------------------------- /demo/bitsocket.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 17 | 18 | 42 | 43 | 44 |

45 | 
46 | 
47 | 


--------------------------------------------------------------------------------
/demo/feecalc.js:
--------------------------------------------------------------------------------
 1 | /********************************************************************
 2 | *
 3 | * Calculate fee with a fixed rate
 4 | *
 5 | ********************************************************************/
 6 | const Minercraft = require('../index');
 7 | (async () => {
 8 |   const miner = new Minercraft()
 9 |   let f = miner.fee.get({
10 |     rate: { standard: 0.5, data: 0.5 },
11 |     tx: "0100000001648ed7d1c1a27ec923445c8d404e227145218c4ce01cf958a898c5a048e8f264020000006a47304402207dc1953455be091c8df18e7f7e1424bc4efdced3e400642f8316e3ef298c3f30022062d833b3f1b94593ec7c088b930e2987475c7d99bf19f5714b12a9facff100df41210273f105be3e7ca116e96c7c40f17267ae05ede7160eb099aa2146a88b6328f4ecffffffff030000000000000000fdc901006a223144535869386876786e36506434546176686d544b7855374255715337636e7868770c57544458565633505a4b474414e5ae89e5bebd2fe585ade5ae892fe99c8de982b119323032302d30342d30365430363a30303a30302b30383a30304c697b22617169223a223538222c22706d3235223a223332222c22706d3130223a223636222c22736f32223a2235222c226e6f32223a223235222c22636f223a22302e373530222c226f33223a223635222c22706f6c223a22504d3130222c22717561223a22e889af227d4cfb78da75d1c16a02311006e077c959964cb29944dfa1d07bf1209e0a6b57b137114aaf2d2d5e446d7b29d59e3c492f22f834d9ea5b3859e826bba4b73fc34cf898b999b0dee89675184ad662c3815094a5293370ca1a298f73415151ba2b9370cdfd9c124f34c55c563fe419c5eb2b9aa5b1fb1e3d7edf66c5cf93fdfa2ed6072a66ae2621d15203775d99fb070013c50da7cab45599c09b04062688999437993f53d91933ade6a7f5d16e37e7e5676842307553aa1b2685c19e02137a93a94c92c74c69dc54bc7f9c173bfbf21882745b379784a60e0a0f071ea4fce1a45f521a399cfae770f6f0605f67f6795f0381688010dd1da7dd0b690c97db22020000000000001976a914666675d887a7ae09835af934096d9fcbbb70eed288ac61290000000000001976a9149e7520bc258934a3d58704ab98ed0200e2c1bb9688ac00000000"
12 |   })
13 |   console.log("fee = ", f)
14 | })()
15 | 


--------------------------------------------------------------------------------
/demo/feerate.js:
--------------------------------------------------------------------------------
 1 | /********************************************************************
 2 | *
 3 | * Get fee quotes from miners
 4 | *
 5 | ********************************************************************/
 6 | const Minercraft = require('../index');
 7 | const Miners = require('./miners.json');
 8 | (async () => {
 9 |   for(let name in Miners) {
10 |     let config = Miners[name];
11 |     const miner = new Minercraft(config)
12 |     const rate = await miner.fee.rate()
13 |     console.log("rate for", name, rate)
14 |   }
15 | })()
16 | 


--------------------------------------------------------------------------------
/demo/feeratecalc.js:
--------------------------------------------------------------------------------
 1 | /********************************************************************
 2 | *
 3 | * Get fee quotes from miners and calculate based on the rate
 4 | *
 5 | ********************************************************************/
 6 | const Minercraft = require('../index');
 7 | const Miners = require('./miners.json');
 8 | (async () => {
 9 |   for(let name in Miners) {
10 |     let config = Miners[name];
11 |     const miner = new Minercraft(config)
12 |     const rate = await miner.fee.rate()
13 |     console.log("rate", rate)
14 |     let f = miner.fee.get({
15 |       rate: rate.mine,
16 |       tx: "0100000001648ed7d1c1a27ec923445c8d404e227145218c4ce01cf958a898c5a048e8f264020000006a47304402207dc1953455be091c8df18e7f7e1424bc4efdced3e400642f8316e3ef298c3f30022062d833b3f1b94593ec7c088b930e2987475c7d99bf19f5714b12a9facff100df41210273f105be3e7ca116e96c7c40f17267ae05ede7160eb099aa2146a88b6328f4ecffffffff030000000000000000fdc901006a223144535869386876786e36506434546176686d544b7855374255715337636e7868770c57544458565633505a4b474414e5ae89e5bebd2fe585ade5ae892fe99c8de982b119323032302d30342d30365430363a30303a30302b30383a30304c697b22617169223a223538222c22706d3235223a223332222c22706d3130223a223636222c22736f32223a2235222c226e6f32223a223235222c22636f223a22302e373530222c226f33223a223635222c22706f6c223a22504d3130222c22717561223a22e889af227d4cfb78da75d1c16a02311006e077c959964cb29944dfa1d07bf1209e0a6b57b137114aaf2d2d5e446d7b29d59e3c492f22f834d9ea5b3859e826bba4b73fc34cf898b999b0dee89675184ad662c3815094a5293370ca1a298f73415151ba2b9370cdfd9c124f34c55c563fe419c5eb2b9aa5b1fb1e3d7edf66c5cf93fdfa2ed6072a66ae2621d15203775d99fb070013c50da7cab45599c09b04062688999437993f53d91933ade6a7f5d16e37e7e5676842307553aa1b2685c19e02137a93a94c92c74c69dc54bc7f9c173bfbf21882745b379784a60e0a0f071ea4fce1a45f521a399cfae770f6f0605f67f6795f0381688010dd1da7dd0b690c97db22020000000000001976a914666675d887a7ae09835af934096d9fcbbb70eed288ac61290000000000001976a9149e7520bc258934a3d58704ab98ed0200e2c1bb9688ac00000000"
17 |     })
18 |     console.log("fee = ", f)
19 |   }
20 | })()
21 | 


--------------------------------------------------------------------------------
/demo/feerateverbose.js:
--------------------------------------------------------------------------------
 1 | /********************************************************************
 2 | *
 3 | * Get fee quotes from miners
 4 | *
 5 | ********************************************************************/
 6 | const Minercraft = require('../index');
 7 | const Miners = require('./miners.json');
 8 | (async () => {
 9 |   for(let name in Miners) {
10 |     let config = Miners[name];
11 |     const miner = new Minercraft(config)
12 |     const rate = await miner.fee.rate({ verbose: true })
13 |     console.log("rate for", name, rate)
14 |   }
15 | })()
16 | 


--------------------------------------------------------------------------------
/demo/feevalidate.js:
--------------------------------------------------------------------------------
 1 | /********************************************************************
 2 | *
 3 | * Calculate fee with a fixed rate
 4 | *
 5 | ********************************************************************/
 6 | const Minercraft = require('../index');
 7 | (async () => {
 8 |   const miner = new Minercraft()
 9 |   let f = miner.fee.get({
10 |     rate: { standard: 0.5, data: 0.5 },
11 |     tx: "0100000001648ed7d1c1a27ec923445c8d404e227145218c4ce01cf958a898c5a048e8f264020000006a47304402207dc1953455be091c8df18e7f7e1424bc4efdced3e400642f8316e3ef298c3f30022062d833b3f1b94593ec7c088b930e2987475c7d99bf19f5714b12a9facff100df41210273f105be3e7ca116e96c7c40f17267ae05ede7160eb099aa2146a88b6328f4ecffffffff030000000000000000fdc901006a223144535869386876786e36506434546176686d544b7855374255715337636e7868770c57544458565633505a4b474414e5ae89e5bebd2fe585ade5ae892fe99c8de982b119323032302d30342d30365430363a30303a30302b30383a30304c697b22617169223a223538222c22706d3235223a223332222c22706d3130223a223636222c22736f32223a2235222c226e6f32223a223235222c22636f223a22302e373530222c226f33223a223635222c22706f6c223a22504d3130222c22717561223a22e889af227d4cfb78da75d1c16a02311006e077c959964cb29944dfa1d07bf1209e0a6b57b137114aaf2d2d5e446d7b29d59e3c492f22f834d9ea5b3859e826bba4b73fc34cf898b999b0dee89675184ad662c3815094a5293370ca1a298f73415151ba2b9370cdfd9c124f34c55c563fe419c5eb2b9aa5b1fb1e3d7edf66c5cf93fdfa2ed6072a66ae2621d15203775d99fb070013c50da7cab45599c09b04062688999437993f53d91933ade6a7f5d16e37e7e5676842307553aa1b2685c19e02137a93a94c92c74c69dc54bc7f9c173bfbf21882745b379784a60e0a0f071ea4fce1a45f521a399cfae770f6f0605f67f6795f0381688010dd1da7dd0b690c97db22020000000000001976a914666675d887a7ae09835af934096d9fcbbb70eed288ac61290000000000001976a9149e7520bc258934a3d58704ab98ed0200e2c1bb9688ac00000000"
12 |   })
13 |   console.log("fee = ", f)
14 | })()
15 | 


--------------------------------------------------------------------------------
/demo/miners.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "mempool.com": {
 3 |     "url": "https://www.ddpurse.com/openapi",
 4 |     "headers": {
 5 |       "token": "561b756d12572020ea9a104c3441b71790acbbce95a6ddbf7e0630971af9424b"
 6 |     }
 7 |   },
 8 |   "taal.com": {
 9 |     "url": "https://merchantapi.taal.com"
10 |   }
11 | }
12 | 


--------------------------------------------------------------------------------
/demo/push.js:
--------------------------------------------------------------------------------
 1 | const Minercraft = require('../index');
 2 | const Miners = require('./miners.json');
 3 | (async () => {
 4 |   for(name in Miners) {
 5 |     let config = Miners[name]
 6 |     console.log("trying", name, config)
 7 |     const miner = new Minercraft(config)
 8 |     let result = await miner.tx.push("0100000001648ed7d1c1a27ec923445c8d404e227145218c4ce01cf958a898c5a048e8f264020000006a47304402207dc1953455be091c8df18e7f7e1424bc4efdced3e400642f8316e3ef298c3f30022062d833b3f1b94593ec7c088b930e2987475c7d99bf19f5714b12a9facff100df41210273f105be3e7ca116e96c7c40f17267ae05ede7160eb099aa2146a88b6328f4ecffffffff030000000000000000fdc901006a223144535869386876786e36506434546176686d544b7855374255715337636e7868770c57544458565633505a4b474414e5ae89e5bebd2fe585ade5ae892fe99c8de982b119323032302d30342d30365430363a30303a30302b30383a30304c697b22617169223a223538222c22706d3235223a223332222c22706d3130223a223636222c22736f32223a2235222c226e6f32223a223235222c22636f223a22302e373530222c226f33223a223635222c22706f6c223a22504d3130222c22717561223a22e889af227d4cfb78da75d1c16a02311006e077c959964cb29944dfa1d07bf1209e0a6b57b137114aaf2d2d5e446d7b29d59e3c492f22f834d9ea5b3859e826bba4b73fc34cf898b999b0dee89675184ad662c3815094a5293370ca1a298f73415151ba2b9370cdfd9c124f34c55c563fe419c5eb2b9aa5b1fb1e3d7edf66c5cf93fdfa2ed6072a66ae2621d15203775d99fb070013c50da7cab45599c09b04062688999437993f53d91933ade6a7f5d16e37e7e5676842307553aa1b2685c19e02137a93a94c92c74c69dc54bc7f9c173bfbf21882745b379784a60e0a0f071ea4fce1a45f521a399cfae770f6f0605f67f6795f0381688010dd1da7dd0b690c97db22020000000000001976a914666675d887a7ae09835af934096d9fcbbb70eed288ac61290000000000001976a9149e7520bc258934a3d58704ab98ed0200e2c1bb9688ac00000000")
 9 |     console.log("result for", name, result)
10 |   }
11 | })()
12 | 


--------------------------------------------------------------------------------
/demo/test.js:
--------------------------------------------------------------------------------
 1 | const bsv = require('bsv')
 2 | const Minercraft = require('../index');
 3 | const Miners = require('./miners.json');
 4 | (async () => {
 5 |   let t = new bsv.Transaction()
 6 |   for(let name in Miners) {
 7 |     let config = Miners[name];
 8 |     const miner = new Minercraft(config)
 9 |     const rate = await miner.fee.rate()
10 |     console.log("rate for", name, rate)
11 |   }
12 | })()
13 | 


--------------------------------------------------------------------------------
/demo/txstatus.js:
--------------------------------------------------------------------------------
 1 | /********************************************************************
 2 | *
 3 | * Verify a transaction confirm status from a miner
 4 | *
 5 | ********************************************************************/
 6 | const Minercraft = require('../index');
 7 | const Miners = require('./miners.json');
 8 | (async () => {
 9 |   for(let name in Miners) {
10 |     let config = Miners[name];
11 |     const miner = new Minercraft(config)
12 |     const txid = "177b4087cf6ef58e7a93a2791762688a848edbc5169166bc4fd128fba84ff8ba"
13 |     let status = await miner.tx.status(txid)
14 |     console.log("status for", txid, "from", name, ":", status)
15 |   }
16 | })()
17 | 


--------------------------------------------------------------------------------
/demo/validate.js:
--------------------------------------------------------------------------------
 1 | /********************************************************************
 2 | *
 3 | * Verify a transaction confirm status from a miner
 4 | *
 5 | ********************************************************************/
 6 | const Minercraft = require('../index');
 7 | const validexample = {
 8 |   payload: '{"apiVersion":"0.1.0","timestamp":"2020-04-30T12:34:00.001Z","returnResult":"success","resultDescription":"","blockHash":"000000000000000004a5686ff15cdb3950939bdc5725970d963e2b03d3d43d45","blockHeight":630700,"confirmations":2166,"minerId":"03e92d3e5c3f7bd945dfbf48e7a99393b1bfb3f11f380ae30d286e7ff2aec5a270","txSecondMempoolExpiry":0}',
 9 |   signature: '30450221009fbc3747e8bd826a4bef9b389c91986d5e2dd38e8952f98d389a111c6ea24c00022040c4379ff32435a7b4cf56a9f3a58c27570d9e5430b7af3ae7941a385d52af4c',
10 |   publicKey: '03e92d3e5c3f7bd945dfbf48e7a99393b1bfb3f11f380ae30d286e7ff2aec5a270',
11 |   encoding: 'UTF-8',
12 |   mimetype: 'application/json'
13 | }
14 | const invalidexample = {
15 |   payload: '{"apiVersion":"0.1.0","timestamp":"2020-04-30T12:34:00.001Z","returnResult":"success","resultDescription":"","blockHash":"100000000000000004a5686ff15cdb3950939bdc5725970d963e2b03d3d43d45","blockHeight":630700,"confirmations":2166,"minerId":"03e92d3e5c3f7bd945dfbf48e7a99393b1bfb3f11f380ae30d286e7ff2aec5a270","txSecondMempoolExpiry":0}',
16 |   signature: '30450221009fbc3747e8bd826a4bef9b389c91986d5e2dd38e8952f98d389a111c6ea24c00022040c4379ff32435a7b4cf56a9f3a58c27570d9e5430b7af3ae7941a385d52af4c',
17 |   publicKey: '03e92d3e5c3f7bd945dfbf48e7a99393b1bfb3f11f380ae30d286e7ff2aec5a270',
18 |   encoding: 'UTF-8',
19 |   mimetype: 'application/json'
20 | }
21 | let isvalid0 = Minercraft.validate(validexample)
22 | console.log("isvalid ?", isvalid0)
23 | let isvalid1 = Minercraft.validate(invalidexample)
24 | console.log("isvalid ?", isvalid1)
25 | 


--------------------------------------------------------------------------------
/demo/verbosetxstatus.js:
--------------------------------------------------------------------------------
 1 | /********************************************************************
 2 | *
 3 | * Verify a transaction confirm status from a miner
 4 | *
 5 | ********************************************************************/
 6 | const Minercraft = require('../index');
 7 | const Miners = require('./miners.json');
 8 | (async () => {
 9 |   for(let name in Miners) {
10 |     let config = Miners[name];
11 |     const miner = new Minercraft(config)
12 |     const txid = "177b4087cf6ef58e7a93a2791762688a848edbc5169166bc4fd128fba84ff8ba"
13 |     let status = await miner.tx.status(txid, { verbose: true })
14 |     console.log("status for", txid, "from", name, ":", status)
15 |   }
16 | })()
17 | 


--------------------------------------------------------------------------------
/demo/webdemo.html:
--------------------------------------------------------------------------------
 1 | 
 2 | 
 3 | 
22 | 
23 | 
24 | 
25 | 28 | 31 |
32 | 33 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /fee.js: -------------------------------------------------------------------------------- 1 | const bsv = require('bsv') 2 | const axios = require('axios') 3 | class Fee { 4 | constructor(o) { 5 | if (o && o.url) { 6 | this.url = o.url 7 | this.headers = o.headers 8 | this.ratePath = "/mapi/feeQuote" 9 | } 10 | this.validate = o.validate; 11 | } 12 | rate(options) { 13 | if (this.url) { 14 | let u = this.url + (this.ratePath ? this.ratePath : "") 15 | return axios.get(u, { headers: this.headers }).then((res) => { 16 | let isvalid; 17 | try { 18 | isvalid = this.validate(res.data) 19 | } catch (e) { 20 | isvalid = false; 21 | } 22 | let response = JSON.parse(res.data.payload) 23 | if (options && options.verbose) { 24 | res.data.payload = response 25 | res.data.valid = isvalid 26 | return res.data; 27 | } else { 28 | let fees = { valid: isvalid, expires: response.expiryTime, mine: {}, relay: {} } 29 | response.fees.forEach((f) => { 30 | fees.mine[f.feeType] = f.miningFee.satoshis/f.miningFee.bytes 31 | fees.relay[f.feeType] = f.relayFee.satoshis/f.relayFee.bytes 32 | }) 33 | return fees 34 | } 35 | }) 36 | } else { 37 | throw new Error("Must instantiate with a miner merchant API root URL") 38 | } 39 | } 40 | get(t) { 41 | /***************************************************************************************** 42 | * 43 | * calculate fee, using the same logic as in: 44 | * https://github.com/moneybutton/bsv/blob/master/lib/transaction/transaction.js#L925-L936 45 | * 46 | *****************************************************************************************/ 47 | if (t.tx) { 48 | let rate = (t.rate ? t.rate : { data: 0.5, standard: 0.5 }) 49 | let tx = new bsv.Transaction(t.tx) 50 | let fee = 0 51 | let staticItems = [ 52 | { script: null, size: 4 }, // version 53 | { script: null, size: 4 }, // locktime 54 | { script: null, size: bsv.encoding.Varint(tx.inputs.length).toBuffer().length }, 55 | { script: null, size: bsv.encoding.Varint(tx.outputs.length).toBuffer().length }, 56 | ] 57 | let inputItems = tx.inputs.map((i) => { 58 | return { script: i, size: null, type: "input" } 59 | }) 60 | let outputItems = tx.outputs.map((o) => { 61 | return { script: o, size: null, type: "output" } 62 | }) 63 | let items = [].concat(staticItems).concat(inputItems).concat(outputItems) 64 | items.forEach((item) => { 65 | let type = this._type(item) 66 | let size = this._size(item) 67 | fee += Math.ceil(size * rate[type]) 68 | }) 69 | return fee 70 | } else { 71 | throw new Error("requires a 'tx' and a 'rate' attribute") 72 | } 73 | } 74 | _type(item) { 75 | // Currently OP_0 OP_RETURN are considered "data" 76 | return (item.data && item.data.chunks && item.data.chunks[0].opcodenum === 0 && item.data.chunks[1].opcodenum === 106 ? "data": "standard") 77 | } 78 | _size(item) { 79 | if (item.type === 'input') { 80 | return item.script._estimateSize() 81 | } else if (item.type === 'output') { 82 | return item.script.getSize() 83 | } else { 84 | return item.size 85 | } 86 | } 87 | } 88 | module.exports = Fee 89 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Minercraft 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const Fee = require('./fee') 2 | const Transaction = require('./transaction') 3 | const Validate = require('./validate') 4 | /*************************************** 5 | new Minercraft({ 6 | url: "https://www.ddpurse.com/openapi", 7 | headers: { 8 | token: "561b756d12572020ea9a104c3441b71790acbbce95a6ddbf7e0630971af9424b" 9 | } 10 | }) 11 | ***************************************/ 12 | class Minercraft { 13 | constructor(o) { 14 | o.validate = Validate 15 | o.headers = Object.assign({ "Content-Type": "application/json" }, o.headers) 16 | this.fee = new Fee(o) 17 | this.tx = new Transaction(o) 18 | this.validate = Validate 19 | } 20 | } 21 | Minercraft.validate = Validate 22 | module.exports = Minercraft 23 | -------------------------------------------------------------------------------- /mm.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interplanaria/minercraft/63a28e1dbc9cc532685a1ebc27fe02dfc87d8644/mm.jpg -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "minercraft", 3 | "version": "0.0.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "JSONStream": { 8 | "version": "1.3.5", 9 | "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", 10 | "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", 11 | "dev": true, 12 | "requires": { 13 | "jsonparse": "^1.2.0", 14 | "through": ">=2.2.7 <3" 15 | } 16 | }, 17 | "acorn": { 18 | "version": "7.1.1", 19 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", 20 | "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", 21 | "dev": true 22 | }, 23 | "acorn-node": { 24 | "version": "1.8.2", 25 | "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", 26 | "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", 27 | "dev": true, 28 | "requires": { 29 | "acorn": "^7.0.0", 30 | "acorn-walk": "^7.0.0", 31 | "xtend": "^4.0.2" 32 | } 33 | }, 34 | "acorn-walk": { 35 | "version": "7.1.1", 36 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz", 37 | "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==", 38 | "dev": true 39 | }, 40 | "aes-js": { 41 | "version": "3.1.2", 42 | "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", 43 | "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" 44 | }, 45 | "asn1.js": { 46 | "version": "4.10.1", 47 | "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", 48 | "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", 49 | "dev": true, 50 | "requires": { 51 | "bn.js": "^4.0.0", 52 | "inherits": "^2.0.1", 53 | "minimalistic-assert": "^1.0.0" 54 | } 55 | }, 56 | "assert": { 57 | "version": "1.5.0", 58 | "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", 59 | "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", 60 | "dev": true, 61 | "requires": { 62 | "object-assign": "^4.1.1", 63 | "util": "0.10.3" 64 | }, 65 | "dependencies": { 66 | "inherits": { 67 | "version": "2.0.1", 68 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", 69 | "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", 70 | "dev": true 71 | }, 72 | "util": { 73 | "version": "0.10.3", 74 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", 75 | "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", 76 | "dev": true, 77 | "requires": { 78 | "inherits": "2.0.1" 79 | } 80 | } 81 | } 82 | }, 83 | "axios": { 84 | "version": "0.19.2", 85 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", 86 | "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", 87 | "requires": { 88 | "follow-redirects": "1.5.10" 89 | } 90 | }, 91 | "balanced-match": { 92 | "version": "1.0.0", 93 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 94 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 95 | "dev": true 96 | }, 97 | "base-x": { 98 | "version": "3.0.8", 99 | "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz", 100 | "integrity": "sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==", 101 | "requires": { 102 | "safe-buffer": "^5.0.1" 103 | } 104 | }, 105 | "base64-js": { 106 | "version": "1.3.1", 107 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", 108 | "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", 109 | "dev": true 110 | }, 111 | "bn.js": { 112 | "version": "4.11.8", 113 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", 114 | "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" 115 | }, 116 | "brace-expansion": { 117 | "version": "1.1.11", 118 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 119 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 120 | "dev": true, 121 | "requires": { 122 | "balanced-match": "^1.0.0", 123 | "concat-map": "0.0.1" 124 | } 125 | }, 126 | "brorand": { 127 | "version": "1.1.0", 128 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", 129 | "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" 130 | }, 131 | "browser-pack": { 132 | "version": "6.1.0", 133 | "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", 134 | "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", 135 | "dev": true, 136 | "requires": { 137 | "JSONStream": "^1.0.3", 138 | "combine-source-map": "~0.8.0", 139 | "defined": "^1.0.0", 140 | "safe-buffer": "^5.1.1", 141 | "through2": "^2.0.0", 142 | "umd": "^3.0.0" 143 | } 144 | }, 145 | "browser-resolve": { 146 | "version": "1.11.3", 147 | "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", 148 | "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", 149 | "dev": true, 150 | "requires": { 151 | "resolve": "1.1.7" 152 | }, 153 | "dependencies": { 154 | "resolve": { 155 | "version": "1.1.7", 156 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", 157 | "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", 158 | "dev": true 159 | } 160 | } 161 | }, 162 | "browserify": { 163 | "version": "16.5.1", 164 | "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.1.tgz", 165 | "integrity": "sha512-EQX0h59Pp+0GtSRb5rL6OTfrttlzv+uyaUVlK6GX3w11SQ0jKPKyjC/54RhPR2ib2KmfcELM06e8FxcI5XNU2A==", 166 | "dev": true, 167 | "requires": { 168 | "JSONStream": "^1.0.3", 169 | "assert": "^1.4.0", 170 | "browser-pack": "^6.0.1", 171 | "browser-resolve": "^1.11.0", 172 | "browserify-zlib": "~0.2.0", 173 | "buffer": "~5.2.1", 174 | "cached-path-relative": "^1.0.0", 175 | "concat-stream": "^1.6.0", 176 | "console-browserify": "^1.1.0", 177 | "constants-browserify": "~1.0.0", 178 | "crypto-browserify": "^3.0.0", 179 | "defined": "^1.0.0", 180 | "deps-sort": "^2.0.0", 181 | "domain-browser": "^1.2.0", 182 | "duplexer2": "~0.1.2", 183 | "events": "^2.0.0", 184 | "glob": "^7.1.0", 185 | "has": "^1.0.0", 186 | "htmlescape": "^1.1.0", 187 | "https-browserify": "^1.0.0", 188 | "inherits": "~2.0.1", 189 | "insert-module-globals": "^7.0.0", 190 | "labeled-stream-splicer": "^2.0.0", 191 | "mkdirp-classic": "^0.5.2", 192 | "module-deps": "^6.0.0", 193 | "os-browserify": "~0.3.0", 194 | "parents": "^1.0.1", 195 | "path-browserify": "~0.0.0", 196 | "process": "~0.11.0", 197 | "punycode": "^1.3.2", 198 | "querystring-es3": "~0.2.0", 199 | "read-only-stream": "^2.0.0", 200 | "readable-stream": "^2.0.2", 201 | "resolve": "^1.1.4", 202 | "shasum": "^1.0.0", 203 | "shell-quote": "^1.6.1", 204 | "stream-browserify": "^2.0.0", 205 | "stream-http": "^3.0.0", 206 | "string_decoder": "^1.1.1", 207 | "subarg": "^1.0.0", 208 | "syntax-error": "^1.1.1", 209 | "through2": "^2.0.0", 210 | "timers-browserify": "^1.0.1", 211 | "tty-browserify": "0.0.1", 212 | "url": "~0.11.0", 213 | "util": "~0.10.1", 214 | "vm-browserify": "^1.0.0", 215 | "xtend": "^4.0.0" 216 | } 217 | }, 218 | "browserify-aes": { 219 | "version": "1.2.0", 220 | "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", 221 | "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", 222 | "dev": true, 223 | "requires": { 224 | "buffer-xor": "^1.0.3", 225 | "cipher-base": "^1.0.0", 226 | "create-hash": "^1.1.0", 227 | "evp_bytestokey": "^1.0.3", 228 | "inherits": "^2.0.1", 229 | "safe-buffer": "^5.0.1" 230 | } 231 | }, 232 | "browserify-cipher": { 233 | "version": "1.0.1", 234 | "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", 235 | "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", 236 | "dev": true, 237 | "requires": { 238 | "browserify-aes": "^1.0.4", 239 | "browserify-des": "^1.0.0", 240 | "evp_bytestokey": "^1.0.0" 241 | } 242 | }, 243 | "browserify-des": { 244 | "version": "1.0.2", 245 | "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", 246 | "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", 247 | "dev": true, 248 | "requires": { 249 | "cipher-base": "^1.0.1", 250 | "des.js": "^1.0.0", 251 | "inherits": "^2.0.1", 252 | "safe-buffer": "^5.1.2" 253 | } 254 | }, 255 | "browserify-rsa": { 256 | "version": "4.0.1", 257 | "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", 258 | "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", 259 | "dev": true, 260 | "requires": { 261 | "bn.js": "^4.1.0", 262 | "randombytes": "^2.0.1" 263 | } 264 | }, 265 | "browserify-sign": { 266 | "version": "4.0.4", 267 | "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", 268 | "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", 269 | "dev": true, 270 | "requires": { 271 | "bn.js": "^4.1.1", 272 | "browserify-rsa": "^4.0.0", 273 | "create-hash": "^1.1.0", 274 | "create-hmac": "^1.1.2", 275 | "elliptic": "^6.0.0", 276 | "inherits": "^2.0.1", 277 | "parse-asn1": "^5.0.0" 278 | } 279 | }, 280 | "browserify-zlib": { 281 | "version": "0.2.0", 282 | "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", 283 | "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", 284 | "dev": true, 285 | "requires": { 286 | "pako": "~1.0.5" 287 | } 288 | }, 289 | "bs58": { 290 | "version": "4.0.1", 291 | "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", 292 | "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", 293 | "requires": { 294 | "base-x": "^3.0.2" 295 | } 296 | }, 297 | "bsv": { 298 | "version": "1.5.0", 299 | "resolved": "https://registry.npmjs.org/bsv/-/bsv-1.5.0.tgz", 300 | "integrity": "sha512-kW98WfxqNmEcNlfnOZQtorHdQNnQOEL0Nx2TASQgfbLexn9ZlLmtIewjmmMdETtnE9EZjn7cFOw2Bh7yiavwbg==", 301 | "requires": { 302 | "aes-js": "^3.1.2", 303 | "bn.js": "=4.11.8", 304 | "bs58": "=4.0.1", 305 | "clone-deep": "^4.0.1", 306 | "elliptic": "6.4.1", 307 | "hash.js": "^1.1.7", 308 | "inherits": "2.0.3", 309 | "unorm": "1.4.1" 310 | } 311 | }, 312 | "buffer": { 313 | "version": "5.2.1", 314 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", 315 | "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", 316 | "dev": true, 317 | "requires": { 318 | "base64-js": "^1.0.2", 319 | "ieee754": "^1.1.4" 320 | } 321 | }, 322 | "buffer-from": { 323 | "version": "1.1.1", 324 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 325 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 326 | "dev": true 327 | }, 328 | "buffer-xor": { 329 | "version": "1.0.3", 330 | "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", 331 | "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", 332 | "dev": true 333 | }, 334 | "builtin-status-codes": { 335 | "version": "3.0.0", 336 | "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", 337 | "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", 338 | "dev": true 339 | }, 340 | "cached-path-relative": { 341 | "version": "1.0.2", 342 | "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", 343 | "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", 344 | "dev": true 345 | }, 346 | "cipher-base": { 347 | "version": "1.0.4", 348 | "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", 349 | "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", 350 | "dev": true, 351 | "requires": { 352 | "inherits": "^2.0.1", 353 | "safe-buffer": "^5.0.1" 354 | } 355 | }, 356 | "clone-deep": { 357 | "version": "4.0.1", 358 | "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", 359 | "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", 360 | "requires": { 361 | "is-plain-object": "^2.0.4", 362 | "kind-of": "^6.0.2", 363 | "shallow-clone": "^3.0.0" 364 | } 365 | }, 366 | "combine-source-map": { 367 | "version": "0.8.0", 368 | "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", 369 | "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", 370 | "dev": true, 371 | "requires": { 372 | "convert-source-map": "~1.1.0", 373 | "inline-source-map": "~0.6.0", 374 | "lodash.memoize": "~3.0.3", 375 | "source-map": "~0.5.3" 376 | }, 377 | "dependencies": { 378 | "source-map": { 379 | "version": "0.5.7", 380 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 381 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 382 | "dev": true 383 | } 384 | } 385 | }, 386 | "commander": { 387 | "version": "2.20.3", 388 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 389 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 390 | "dev": true 391 | }, 392 | "concat-map": { 393 | "version": "0.0.1", 394 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 395 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 396 | "dev": true 397 | }, 398 | "concat-stream": { 399 | "version": "1.6.2", 400 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 401 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 402 | "dev": true, 403 | "requires": { 404 | "buffer-from": "^1.0.0", 405 | "inherits": "^2.0.3", 406 | "readable-stream": "^2.2.2", 407 | "typedarray": "^0.0.6" 408 | } 409 | }, 410 | "console-browserify": { 411 | "version": "1.2.0", 412 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", 413 | "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", 414 | "dev": true 415 | }, 416 | "constants-browserify": { 417 | "version": "1.0.0", 418 | "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", 419 | "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", 420 | "dev": true 421 | }, 422 | "convert-source-map": { 423 | "version": "1.1.3", 424 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", 425 | "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", 426 | "dev": true 427 | }, 428 | "core-util-is": { 429 | "version": "1.0.2", 430 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 431 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 432 | "dev": true 433 | }, 434 | "create-ecdh": { 435 | "version": "4.0.3", 436 | "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", 437 | "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", 438 | "dev": true, 439 | "requires": { 440 | "bn.js": "^4.1.0", 441 | "elliptic": "^6.0.0" 442 | } 443 | }, 444 | "create-hash": { 445 | "version": "1.2.0", 446 | "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", 447 | "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", 448 | "dev": true, 449 | "requires": { 450 | "cipher-base": "^1.0.1", 451 | "inherits": "^2.0.1", 452 | "md5.js": "^1.3.4", 453 | "ripemd160": "^2.0.1", 454 | "sha.js": "^2.4.0" 455 | } 456 | }, 457 | "create-hmac": { 458 | "version": "1.1.7", 459 | "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", 460 | "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", 461 | "dev": true, 462 | "requires": { 463 | "cipher-base": "^1.0.3", 464 | "create-hash": "^1.1.0", 465 | "inherits": "^2.0.1", 466 | "ripemd160": "^2.0.0", 467 | "safe-buffer": "^5.0.1", 468 | "sha.js": "^2.4.8" 469 | } 470 | }, 471 | "crypto-browserify": { 472 | "version": "3.12.0", 473 | "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", 474 | "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", 475 | "dev": true, 476 | "requires": { 477 | "browserify-cipher": "^1.0.0", 478 | "browserify-sign": "^4.0.0", 479 | "create-ecdh": "^4.0.0", 480 | "create-hash": "^1.1.0", 481 | "create-hmac": "^1.1.0", 482 | "diffie-hellman": "^5.0.0", 483 | "inherits": "^2.0.1", 484 | "pbkdf2": "^3.0.3", 485 | "public-encrypt": "^4.0.0", 486 | "randombytes": "^2.0.0", 487 | "randomfill": "^1.0.3" 488 | } 489 | }, 490 | "dash-ast": { 491 | "version": "1.0.0", 492 | "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", 493 | "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", 494 | "dev": true 495 | }, 496 | "debug": { 497 | "version": "3.1.0", 498 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 499 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 500 | "requires": { 501 | "ms": "2.0.0" 502 | } 503 | }, 504 | "defined": { 505 | "version": "1.0.0", 506 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 507 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", 508 | "dev": true 509 | }, 510 | "deps-sort": { 511 | "version": "2.0.1", 512 | "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", 513 | "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", 514 | "dev": true, 515 | "requires": { 516 | "JSONStream": "^1.0.3", 517 | "shasum-object": "^1.0.0", 518 | "subarg": "^1.0.0", 519 | "through2": "^2.0.0" 520 | } 521 | }, 522 | "des.js": { 523 | "version": "1.0.1", 524 | "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", 525 | "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", 526 | "dev": true, 527 | "requires": { 528 | "inherits": "^2.0.1", 529 | "minimalistic-assert": "^1.0.0" 530 | } 531 | }, 532 | "detective": { 533 | "version": "5.2.0", 534 | "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", 535 | "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", 536 | "dev": true, 537 | "requires": { 538 | "acorn-node": "^1.6.1", 539 | "defined": "^1.0.0", 540 | "minimist": "^1.1.1" 541 | } 542 | }, 543 | "diffie-hellman": { 544 | "version": "5.0.3", 545 | "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", 546 | "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", 547 | "dev": true, 548 | "requires": { 549 | "bn.js": "^4.1.0", 550 | "miller-rabin": "^4.0.0", 551 | "randombytes": "^2.0.0" 552 | } 553 | }, 554 | "domain-browser": { 555 | "version": "1.2.0", 556 | "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", 557 | "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", 558 | "dev": true 559 | }, 560 | "duplexer2": { 561 | "version": "0.1.4", 562 | "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", 563 | "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", 564 | "dev": true, 565 | "requires": { 566 | "readable-stream": "^2.0.2" 567 | } 568 | }, 569 | "elliptic": { 570 | "version": "6.4.1", 571 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", 572 | "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", 573 | "requires": { 574 | "bn.js": "^4.4.0", 575 | "brorand": "^1.0.1", 576 | "hash.js": "^1.0.0", 577 | "hmac-drbg": "^1.0.0", 578 | "inherits": "^2.0.1", 579 | "minimalistic-assert": "^1.0.0", 580 | "minimalistic-crypto-utils": "^1.0.0" 581 | } 582 | }, 583 | "events": { 584 | "version": "2.1.0", 585 | "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", 586 | "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", 587 | "dev": true 588 | }, 589 | "evp_bytestokey": { 590 | "version": "1.0.3", 591 | "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", 592 | "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", 593 | "dev": true, 594 | "requires": { 595 | "md5.js": "^1.3.4", 596 | "safe-buffer": "^5.1.1" 597 | } 598 | }, 599 | "fast-safe-stringify": { 600 | "version": "2.0.7", 601 | "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", 602 | "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==", 603 | "dev": true 604 | }, 605 | "follow-redirects": { 606 | "version": "1.5.10", 607 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", 608 | "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", 609 | "requires": { 610 | "debug": "=3.1.0" 611 | } 612 | }, 613 | "fs.realpath": { 614 | "version": "1.0.0", 615 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 616 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 617 | "dev": true 618 | }, 619 | "function-bind": { 620 | "version": "1.1.1", 621 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 622 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 623 | "dev": true 624 | }, 625 | "get-assigned-identifiers": { 626 | "version": "1.2.0", 627 | "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", 628 | "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", 629 | "dev": true 630 | }, 631 | "glob": { 632 | "version": "7.1.6", 633 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 634 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 635 | "dev": true, 636 | "requires": { 637 | "fs.realpath": "^1.0.0", 638 | "inflight": "^1.0.4", 639 | "inherits": "2", 640 | "minimatch": "^3.0.4", 641 | "once": "^1.3.0", 642 | "path-is-absolute": "^1.0.0" 643 | } 644 | }, 645 | "has": { 646 | "version": "1.0.3", 647 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 648 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 649 | "dev": true, 650 | "requires": { 651 | "function-bind": "^1.1.1" 652 | } 653 | }, 654 | "hash-base": { 655 | "version": "3.0.4", 656 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", 657 | "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", 658 | "dev": true, 659 | "requires": { 660 | "inherits": "^2.0.1", 661 | "safe-buffer": "^5.0.1" 662 | } 663 | }, 664 | "hash.js": { 665 | "version": "1.1.7", 666 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", 667 | "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", 668 | "requires": { 669 | "inherits": "^2.0.3", 670 | "minimalistic-assert": "^1.0.1" 671 | } 672 | }, 673 | "hmac-drbg": { 674 | "version": "1.0.1", 675 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", 676 | "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", 677 | "requires": { 678 | "hash.js": "^1.0.3", 679 | "minimalistic-assert": "^1.0.0", 680 | "minimalistic-crypto-utils": "^1.0.1" 681 | } 682 | }, 683 | "htmlescape": { 684 | "version": "1.1.1", 685 | "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", 686 | "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", 687 | "dev": true 688 | }, 689 | "https-browserify": { 690 | "version": "1.0.0", 691 | "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", 692 | "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", 693 | "dev": true 694 | }, 695 | "ieee754": { 696 | "version": "1.1.13", 697 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", 698 | "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", 699 | "dev": true 700 | }, 701 | "inflight": { 702 | "version": "1.0.6", 703 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 704 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 705 | "dev": true, 706 | "requires": { 707 | "once": "^1.3.0", 708 | "wrappy": "1" 709 | } 710 | }, 711 | "inherits": { 712 | "version": "2.0.3", 713 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 714 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 715 | }, 716 | "inline-source-map": { 717 | "version": "0.6.2", 718 | "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", 719 | "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", 720 | "dev": true, 721 | "requires": { 722 | "source-map": "~0.5.3" 723 | }, 724 | "dependencies": { 725 | "source-map": { 726 | "version": "0.5.7", 727 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 728 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 729 | "dev": true 730 | } 731 | } 732 | }, 733 | "insert-module-globals": { 734 | "version": "7.2.0", 735 | "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", 736 | "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", 737 | "dev": true, 738 | "requires": { 739 | "JSONStream": "^1.0.3", 740 | "acorn-node": "^1.5.2", 741 | "combine-source-map": "^0.8.0", 742 | "concat-stream": "^1.6.1", 743 | "is-buffer": "^1.1.0", 744 | "path-is-absolute": "^1.0.1", 745 | "process": "~0.11.0", 746 | "through2": "^2.0.0", 747 | "undeclared-identifiers": "^1.1.2", 748 | "xtend": "^4.0.0" 749 | } 750 | }, 751 | "is-buffer": { 752 | "version": "1.1.6", 753 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 754 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 755 | "dev": true 756 | }, 757 | "is-plain-object": { 758 | "version": "2.0.4", 759 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 760 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 761 | "requires": { 762 | "isobject": "^3.0.1" 763 | } 764 | }, 765 | "isarray": { 766 | "version": "1.0.0", 767 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 768 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 769 | "dev": true 770 | }, 771 | "isobject": { 772 | "version": "3.0.1", 773 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 774 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" 775 | }, 776 | "json-stable-stringify": { 777 | "version": "0.0.1", 778 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", 779 | "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", 780 | "dev": true, 781 | "requires": { 782 | "jsonify": "~0.0.0" 783 | } 784 | }, 785 | "jsonify": { 786 | "version": "0.0.0", 787 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 788 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", 789 | "dev": true 790 | }, 791 | "jsonparse": { 792 | "version": "1.3.1", 793 | "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", 794 | "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", 795 | "dev": true 796 | }, 797 | "kind-of": { 798 | "version": "6.0.3", 799 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", 800 | "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" 801 | }, 802 | "labeled-stream-splicer": { 803 | "version": "2.0.2", 804 | "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", 805 | "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", 806 | "dev": true, 807 | "requires": { 808 | "inherits": "^2.0.1", 809 | "stream-splicer": "^2.0.0" 810 | } 811 | }, 812 | "lodash.memoize": { 813 | "version": "3.0.4", 814 | "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", 815 | "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", 816 | "dev": true 817 | }, 818 | "md5.js": { 819 | "version": "1.3.5", 820 | "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", 821 | "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", 822 | "dev": true, 823 | "requires": { 824 | "hash-base": "^3.0.0", 825 | "inherits": "^2.0.1", 826 | "safe-buffer": "^5.1.2" 827 | } 828 | }, 829 | "miller-rabin": { 830 | "version": "4.0.1", 831 | "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", 832 | "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", 833 | "dev": true, 834 | "requires": { 835 | "bn.js": "^4.0.0", 836 | "brorand": "^1.0.1" 837 | } 838 | }, 839 | "minimalistic-assert": { 840 | "version": "1.0.1", 841 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", 842 | "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" 843 | }, 844 | "minimalistic-crypto-utils": { 845 | "version": "1.0.1", 846 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", 847 | "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" 848 | }, 849 | "minimatch": { 850 | "version": "3.0.4", 851 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 852 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 853 | "dev": true, 854 | "requires": { 855 | "brace-expansion": "^1.1.7" 856 | } 857 | }, 858 | "minimist": { 859 | "version": "1.2.5", 860 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 861 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 862 | "dev": true 863 | }, 864 | "mkdirp-classic": { 865 | "version": "0.5.2", 866 | "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.2.tgz", 867 | "integrity": "sha512-ejdnDQcR75gwknmMw/tx02AuRs8jCtqFoFqDZMjiNxsu85sRIJVXDKHuLYvUUPRBUtV2FpSZa9bL1BUa3BdR2g==", 868 | "dev": true 869 | }, 870 | "module-deps": { 871 | "version": "6.2.2", 872 | "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.2.tgz", 873 | "integrity": "sha512-a9y6yDv5u5I4A+IPHTnqFxcaKr4p50/zxTjcQJaX2ws9tN/W6J6YXnEKhqRyPhl494dkcxx951onSKVezmI+3w==", 874 | "dev": true, 875 | "requires": { 876 | "JSONStream": "^1.0.3", 877 | "browser-resolve": "^1.7.0", 878 | "cached-path-relative": "^1.0.2", 879 | "concat-stream": "~1.6.0", 880 | "defined": "^1.0.0", 881 | "detective": "^5.2.0", 882 | "duplexer2": "^0.1.2", 883 | "inherits": "^2.0.1", 884 | "parents": "^1.0.0", 885 | "readable-stream": "^2.0.2", 886 | "resolve": "^1.4.0", 887 | "stream-combiner2": "^1.1.1", 888 | "subarg": "^1.0.0", 889 | "through2": "^2.0.0", 890 | "xtend": "^4.0.0" 891 | } 892 | }, 893 | "ms": { 894 | "version": "2.0.0", 895 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 896 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 897 | }, 898 | "object-assign": { 899 | "version": "4.1.1", 900 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 901 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 902 | "dev": true 903 | }, 904 | "once": { 905 | "version": "1.4.0", 906 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 907 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 908 | "dev": true, 909 | "requires": { 910 | "wrappy": "1" 911 | } 912 | }, 913 | "os-browserify": { 914 | "version": "0.3.0", 915 | "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", 916 | "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", 917 | "dev": true 918 | }, 919 | "pako": { 920 | "version": "1.0.11", 921 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 922 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", 923 | "dev": true 924 | }, 925 | "parents": { 926 | "version": "1.0.1", 927 | "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", 928 | "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", 929 | "dev": true, 930 | "requires": { 931 | "path-platform": "~0.11.15" 932 | } 933 | }, 934 | "parse-asn1": { 935 | "version": "5.1.5", 936 | "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", 937 | "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", 938 | "dev": true, 939 | "requires": { 940 | "asn1.js": "^4.0.0", 941 | "browserify-aes": "^1.0.0", 942 | "create-hash": "^1.1.0", 943 | "evp_bytestokey": "^1.0.0", 944 | "pbkdf2": "^3.0.3", 945 | "safe-buffer": "^5.1.1" 946 | } 947 | }, 948 | "path-browserify": { 949 | "version": "0.0.1", 950 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", 951 | "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", 952 | "dev": true 953 | }, 954 | "path-is-absolute": { 955 | "version": "1.0.1", 956 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 957 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 958 | "dev": true 959 | }, 960 | "path-parse": { 961 | "version": "1.0.6", 962 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 963 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 964 | "dev": true 965 | }, 966 | "path-platform": { 967 | "version": "0.11.15", 968 | "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", 969 | "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", 970 | "dev": true 971 | }, 972 | "pbkdf2": { 973 | "version": "3.0.17", 974 | "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", 975 | "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", 976 | "dev": true, 977 | "requires": { 978 | "create-hash": "^1.1.2", 979 | "create-hmac": "^1.1.4", 980 | "ripemd160": "^2.0.1", 981 | "safe-buffer": "^5.0.1", 982 | "sha.js": "^2.4.8" 983 | } 984 | }, 985 | "process": { 986 | "version": "0.11.10", 987 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 988 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", 989 | "dev": true 990 | }, 991 | "process-nextick-args": { 992 | "version": "2.0.1", 993 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 994 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 995 | "dev": true 996 | }, 997 | "public-encrypt": { 998 | "version": "4.0.3", 999 | "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", 1000 | "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", 1001 | "dev": true, 1002 | "requires": { 1003 | "bn.js": "^4.1.0", 1004 | "browserify-rsa": "^4.0.0", 1005 | "create-hash": "^1.1.0", 1006 | "parse-asn1": "^5.0.0", 1007 | "randombytes": "^2.0.1", 1008 | "safe-buffer": "^5.1.2" 1009 | } 1010 | }, 1011 | "punycode": { 1012 | "version": "1.4.1", 1013 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 1014 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 1015 | "dev": true 1016 | }, 1017 | "querystring": { 1018 | "version": "0.2.0", 1019 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 1020 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", 1021 | "dev": true 1022 | }, 1023 | "querystring-es3": { 1024 | "version": "0.2.1", 1025 | "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", 1026 | "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", 1027 | "dev": true 1028 | }, 1029 | "randombytes": { 1030 | "version": "2.1.0", 1031 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 1032 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 1033 | "dev": true, 1034 | "requires": { 1035 | "safe-buffer": "^5.1.0" 1036 | } 1037 | }, 1038 | "randomfill": { 1039 | "version": "1.0.4", 1040 | "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", 1041 | "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", 1042 | "dev": true, 1043 | "requires": { 1044 | "randombytes": "^2.0.5", 1045 | "safe-buffer": "^5.1.0" 1046 | } 1047 | }, 1048 | "read-only-stream": { 1049 | "version": "2.0.0", 1050 | "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", 1051 | "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", 1052 | "dev": true, 1053 | "requires": { 1054 | "readable-stream": "^2.0.2" 1055 | } 1056 | }, 1057 | "readable-stream": { 1058 | "version": "2.3.7", 1059 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1060 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1061 | "dev": true, 1062 | "requires": { 1063 | "core-util-is": "~1.0.0", 1064 | "inherits": "~2.0.3", 1065 | "isarray": "~1.0.0", 1066 | "process-nextick-args": "~2.0.0", 1067 | "safe-buffer": "~5.1.1", 1068 | "string_decoder": "~1.1.1", 1069 | "util-deprecate": "~1.0.1" 1070 | }, 1071 | "dependencies": { 1072 | "safe-buffer": { 1073 | "version": "5.1.2", 1074 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1075 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1076 | "dev": true 1077 | }, 1078 | "string_decoder": { 1079 | "version": "1.1.1", 1080 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1081 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1082 | "dev": true, 1083 | "requires": { 1084 | "safe-buffer": "~5.1.0" 1085 | } 1086 | } 1087 | } 1088 | }, 1089 | "resolve": { 1090 | "version": "1.15.1", 1091 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", 1092 | "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", 1093 | "dev": true, 1094 | "requires": { 1095 | "path-parse": "^1.0.6" 1096 | } 1097 | }, 1098 | "ripemd160": { 1099 | "version": "2.0.2", 1100 | "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", 1101 | "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", 1102 | "dev": true, 1103 | "requires": { 1104 | "hash-base": "^3.0.0", 1105 | "inherits": "^2.0.1" 1106 | } 1107 | }, 1108 | "safe-buffer": { 1109 | "version": "5.2.0", 1110 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", 1111 | "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" 1112 | }, 1113 | "sha.js": { 1114 | "version": "2.4.11", 1115 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", 1116 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", 1117 | "dev": true, 1118 | "requires": { 1119 | "inherits": "^2.0.1", 1120 | "safe-buffer": "^5.0.1" 1121 | } 1122 | }, 1123 | "shallow-clone": { 1124 | "version": "3.0.1", 1125 | "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", 1126 | "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", 1127 | "requires": { 1128 | "kind-of": "^6.0.2" 1129 | } 1130 | }, 1131 | "shasum": { 1132 | "version": "1.0.2", 1133 | "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", 1134 | "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", 1135 | "dev": true, 1136 | "requires": { 1137 | "json-stable-stringify": "~0.0.0", 1138 | "sha.js": "~2.4.4" 1139 | } 1140 | }, 1141 | "shasum-object": { 1142 | "version": "1.0.0", 1143 | "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", 1144 | "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", 1145 | "dev": true, 1146 | "requires": { 1147 | "fast-safe-stringify": "^2.0.7" 1148 | } 1149 | }, 1150 | "shell-quote": { 1151 | "version": "1.7.2", 1152 | "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", 1153 | "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", 1154 | "dev": true 1155 | }, 1156 | "simple-concat": { 1157 | "version": "1.0.0", 1158 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", 1159 | "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", 1160 | "dev": true 1161 | }, 1162 | "source-map": { 1163 | "version": "0.6.1", 1164 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1165 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1166 | "dev": true 1167 | }, 1168 | "source-map-support": { 1169 | "version": "0.5.16", 1170 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", 1171 | "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", 1172 | "dev": true, 1173 | "requires": { 1174 | "buffer-from": "^1.0.0", 1175 | "source-map": "^0.6.0" 1176 | } 1177 | }, 1178 | "stream-browserify": { 1179 | "version": "2.0.2", 1180 | "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", 1181 | "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", 1182 | "dev": true, 1183 | "requires": { 1184 | "inherits": "~2.0.1", 1185 | "readable-stream": "^2.0.2" 1186 | } 1187 | }, 1188 | "stream-combiner2": { 1189 | "version": "1.1.1", 1190 | "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", 1191 | "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", 1192 | "dev": true, 1193 | "requires": { 1194 | "duplexer2": "~0.1.0", 1195 | "readable-stream": "^2.0.2" 1196 | } 1197 | }, 1198 | "stream-http": { 1199 | "version": "3.1.0", 1200 | "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.0.tgz", 1201 | "integrity": "sha512-cuB6RgO7BqC4FBYzmnvhob5Do3wIdIsXAgGycHJnW+981gHqoYcYz9lqjJrk8WXRddbwPuqPYRl+bag6mYv4lw==", 1202 | "dev": true, 1203 | "requires": { 1204 | "builtin-status-codes": "^3.0.0", 1205 | "inherits": "^2.0.1", 1206 | "readable-stream": "^3.0.6", 1207 | "xtend": "^4.0.0" 1208 | }, 1209 | "dependencies": { 1210 | "readable-stream": { 1211 | "version": "3.6.0", 1212 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1213 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1214 | "dev": true, 1215 | "requires": { 1216 | "inherits": "^2.0.3", 1217 | "string_decoder": "^1.1.1", 1218 | "util-deprecate": "^1.0.1" 1219 | } 1220 | } 1221 | } 1222 | }, 1223 | "stream-splicer": { 1224 | "version": "2.0.1", 1225 | "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", 1226 | "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", 1227 | "dev": true, 1228 | "requires": { 1229 | "inherits": "^2.0.1", 1230 | "readable-stream": "^2.0.2" 1231 | } 1232 | }, 1233 | "string_decoder": { 1234 | "version": "1.3.0", 1235 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1236 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1237 | "dev": true, 1238 | "requires": { 1239 | "safe-buffer": "~5.2.0" 1240 | } 1241 | }, 1242 | "subarg": { 1243 | "version": "1.0.0", 1244 | "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", 1245 | "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", 1246 | "dev": true, 1247 | "requires": { 1248 | "minimist": "^1.1.0" 1249 | } 1250 | }, 1251 | "syntax-error": { 1252 | "version": "1.4.0", 1253 | "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", 1254 | "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", 1255 | "dev": true, 1256 | "requires": { 1257 | "acorn-node": "^1.2.0" 1258 | } 1259 | }, 1260 | "terser": { 1261 | "version": "4.6.11", 1262 | "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.11.tgz", 1263 | "integrity": "sha512-76Ynm7OXUG5xhOpblhytE7X58oeNSmC8xnNhjWVo8CksHit0U0kO4hfNbPrrYwowLWFgM2n9L176VNx2QaHmtA==", 1264 | "dev": true, 1265 | "requires": { 1266 | "commander": "^2.20.0", 1267 | "source-map": "~0.6.1", 1268 | "source-map-support": "~0.5.12" 1269 | } 1270 | }, 1271 | "through": { 1272 | "version": "2.3.8", 1273 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1274 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1275 | "dev": true 1276 | }, 1277 | "through2": { 1278 | "version": "2.0.5", 1279 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 1280 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 1281 | "dev": true, 1282 | "requires": { 1283 | "readable-stream": "~2.3.6", 1284 | "xtend": "~4.0.1" 1285 | } 1286 | }, 1287 | "timers-browserify": { 1288 | "version": "1.4.2", 1289 | "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", 1290 | "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", 1291 | "dev": true, 1292 | "requires": { 1293 | "process": "~0.11.0" 1294 | } 1295 | }, 1296 | "tty-browserify": { 1297 | "version": "0.0.1", 1298 | "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", 1299 | "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", 1300 | "dev": true 1301 | }, 1302 | "typedarray": { 1303 | "version": "0.0.6", 1304 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1305 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 1306 | "dev": true 1307 | }, 1308 | "umd": { 1309 | "version": "3.0.3", 1310 | "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", 1311 | "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", 1312 | "dev": true 1313 | }, 1314 | "undeclared-identifiers": { 1315 | "version": "1.1.3", 1316 | "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", 1317 | "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", 1318 | "dev": true, 1319 | "requires": { 1320 | "acorn-node": "^1.3.0", 1321 | "dash-ast": "^1.0.0", 1322 | "get-assigned-identifiers": "^1.2.0", 1323 | "simple-concat": "^1.0.0", 1324 | "xtend": "^4.0.1" 1325 | } 1326 | }, 1327 | "unorm": { 1328 | "version": "1.4.1", 1329 | "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.4.1.tgz", 1330 | "integrity": "sha1-NkIA1fE2RsqLzURJAnEzVhR5IwA=" 1331 | }, 1332 | "url": { 1333 | "version": "0.11.0", 1334 | "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", 1335 | "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", 1336 | "dev": true, 1337 | "requires": { 1338 | "punycode": "1.3.2", 1339 | "querystring": "0.2.0" 1340 | }, 1341 | "dependencies": { 1342 | "punycode": { 1343 | "version": "1.3.2", 1344 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 1345 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", 1346 | "dev": true 1347 | } 1348 | } 1349 | }, 1350 | "util": { 1351 | "version": "0.10.4", 1352 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", 1353 | "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", 1354 | "dev": true, 1355 | "requires": { 1356 | "inherits": "2.0.3" 1357 | } 1358 | }, 1359 | "util-deprecate": { 1360 | "version": "1.0.2", 1361 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1362 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1363 | "dev": true 1364 | }, 1365 | "vm-browserify": { 1366 | "version": "1.1.2", 1367 | "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", 1368 | "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", 1369 | "dev": true 1370 | }, 1371 | "wrappy": { 1372 | "version": "1.0.2", 1373 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1374 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1375 | "dev": true 1376 | }, 1377 | "xtend": { 1378 | "version": "4.0.2", 1379 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1380 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 1381 | "dev": true 1382 | } 1383 | } 1384 | } 1385 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "minercraft", 3 | "version": "0.0.8", 4 | "description": "interact with bitcoin miner apis", 5 | "main": "index.js", 6 | "scripts": { 7 | "build": "node_modules/browserify/bin/cmd.js index.js --standalone Minercraft > dist/minercraft.js && node_modules/terser/bin/terser dist/minercraft.js > dist/minercraft.min.js" 8 | }, 9 | "unpkg": "dist/minercraft.min.js", 10 | "author": "planaria corp", 11 | "license": "ISC", 12 | "dependencies": { 13 | "axios": "^0.19.2", 14 | "bsv": "^1.5.0" 15 | }, 16 | "devDependencies": { 17 | "browserify": "^16.5.1", 18 | "terser": "^4.6.11" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /poster.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interplanaria/minercraft/63a28e1dbc9cc532685a1ebc27fe02dfc87d8644/poster.png -------------------------------------------------------------------------------- /style.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: 'Roboto', sans-serif; 4 | } 5 | img.logo { 6 | max-width: 400px !important; 7 | width: 100% !important; 8 | padding: 20px !important; 9 | } 10 | .button { 11 | margin: 0 auto; 12 | background: rgba(0,0,0,0.8); 13 | color: white !important; 14 | padding: 5px 10px; 15 | text-decoration: none; 16 | border-radius: 2px; 17 | } 18 | .cover-main img { 19 | width: 150px; 20 | border: none; 21 | padding: 0; 22 | margin: 0; 23 | } 24 | img { 25 | border: 1px solid rgba(0,0,0,0.08); 26 | border-radius: 3px; 27 | padding: 5px; 28 | } 29 | .no-border { 30 | border: none !important; 31 | } 32 | img.top { 33 | width: 200px; 34 | padding: 0; 35 | border: none; 36 | display: block; 37 | margin: 0 auto; 38 | } 39 | h1#bitbus { 40 | text-align: center; 41 | } 42 | blockquote { 43 | padding: 5px; 44 | background: rgba(0,0,0,0.02); 45 | color: rgba(0,0,0,0.7) !important; 46 | } 47 | section.cover .cover-main { 48 | margin: 0; 49 | color: white; 50 | font-weight: bold; 51 | } 52 | section.cover .cover-main>p a { 53 | border: none !important; 54 | } 55 | section.cover .cover-main>p:last-child a { 56 | background: rgba(0,0,0,0.6) !important; 57 | color: white; 58 | margin: 3px; 59 | width: 150px; 60 | padding: 2px 10px !important; 61 | border-radius: 2px !important; 62 | color: white !important; 63 | font-size: 10px !important; 64 | font-family: arial !important; 65 | } 66 | section.cover.has-mask .mask { 67 | background: none !important; 68 | } 69 | section.cover p { 70 | text-transform: uppercase; 71 | } 72 | .markdown-section { 73 | max-width: 800px !important; 74 | } 75 | .markdown-section ol, .markdown-section p, .markdown-section ul, .markdown-section pre{ 76 | line-height: 1.4rem; 77 | } 78 | .markdown-section pre { 79 | padding: 10px !important; 80 | line-height: 16px !important; 81 | font-size: 11px !important; 82 | } 83 | code { 84 | overflow-wrap: break-word; 85 | word-wrap: break-word; 86 | -ms-word-break: break-all; 87 | word-break: break-word; 88 | } 89 | .markdown-section code { 90 | padding: 0 !important; 91 | background: none !important; 92 | } 93 | a { 94 | overflow-wrap: break-word; 95 | word-wrap: break-word; 96 | 97 | -ms-word-break: break-all; 98 | word-break: break-word; 99 | 100 | } 101 | .anchor span { 102 | /* 103 | font-family: 'Racing Sans One', cursive; 104 | */ 105 | color: rgba(0,0,0,0.8) !important; 106 | } 107 | 108 | h1,h2,h3,h4,h5 { 109 | font-weight: 600 !important; 110 | font-family: 'Teko', sans-serif; 111 | } 112 | h1 { 113 | font-size: 40px !important; 114 | padding: 10px 0; 115 | } 116 | h2 { 117 | letter-spacing: -1px; 118 | } 119 | h3 { 120 | font-size: 18px !important; 121 | } 122 | .cover-main h1 a { 123 | font-size: 50px; 124 | } 125 | .cover-main { 126 | overflow: hidden; 127 | } 128 | .cover-main p { 129 | font-family: Menlo, monaco, arial; 130 | font-size: 12px; 131 | } 132 | #ticker { 133 | width: 100%; 134 | height: 300px; 135 | padding: 5px; 136 | background: rgba(0,0,0,0.8); 137 | color: white; 138 | border: none; 139 | margin: 0; 140 | overflow: auto; 141 | } 142 | #ticker .item { 143 | text-align: left; 144 | font-size: 11px; 145 | border: none; 146 | background: none; 147 | color: white; 148 | width: 100%; 149 | height: auto; 150 | transition:transform 0.3s ease-out; 151 | transform:scaleY(1); 152 | transform-origin:top; 153 | } 154 | #ticker .item.hidden { 155 | transform:scaleY(0); 156 | } 157 | -------------------------------------------------------------------------------- /transaction.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios') 2 | class Transaction { 3 | constructor(o) { 4 | if (o && o.url) { 5 | this.url = o.url 6 | this.headers = o.headers 7 | this.statusPath = "/mapi/tx" 8 | this.pushPath = "/mapi/tx" 9 | } 10 | this.validate = o.validate; 11 | } 12 | push(rawtx, options) { 13 | if (this.url) { 14 | let u = this.url + (this.pushPath ? this.pushPath : "") 15 | return axios.post(u, { rawtx: rawtx }, { 16 | headers: this.headers 17 | }).then((res) => { 18 | if (options && options.verbose) { 19 | res.data.payload = JSON.parse(res.data.payload) 20 | return res.data 21 | } else { 22 | return JSON.parse(res.data.payload) 23 | } 24 | }) 25 | } else { 26 | throw new Error("Must instantiate with a miner merchant API root URL") 27 | } 28 | } 29 | status(id, options) { 30 | if (this.url) { 31 | let u = this.url + (this.statusPath ? this.statusPath : "") + "/" + id 32 | return axios.get(u, { headers: this.headers }).then((res) => { 33 | let isvalid; 34 | try { 35 | isvalid = this.validate(res.data) 36 | } catch (e) { 37 | isvalid = false; 38 | } 39 | if (options && options.verbose) { 40 | res.data.payload = JSON.parse(res.data.payload) 41 | res.data.valid = isvalid 42 | return res.data 43 | } else { 44 | let j = JSON.parse(res.data.payload) 45 | j.valid = isvalid 46 | return j 47 | } 48 | }) 49 | } else { 50 | throw new Error("Must instantiate with a miner merchant API root URL") 51 | } 52 | } 53 | } 54 | module.exports = Transaction 55 | -------------------------------------------------------------------------------- /validate.js: -------------------------------------------------------------------------------- 1 | const bsv = require('bsv') 2 | module.exports = (status) => { 3 | const payloadHash = bsv.crypto.Hash.sha256(Buffer.from(status.payload)) 4 | const signature = bsv.crypto.Signature.fromString(status.signature) 5 | const publicKey = bsv.PublicKey.fromString(status.publicKey) 6 | return bsv.crypto.ECDSA.verify(payloadHash, signature, publicKey) 7 | } 8 | -------------------------------------------------------------------------------- /vue.css: -------------------------------------------------------------------------------- 1 | @import url("https://fonts.googleapis.com/css?family=Roboto+Mono|Source+Sans+Pro:300,400,600");*{-webkit-font-smoothing:antialiased;-webkit-overflow-scrolling:touch;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-text-size-adjust:none;-webkit-touch-callout:none;box-sizing:border-box}body:not(.ready){overflow:hidden}body:not(.ready) .app-nav,body:not(.ready)>nav,body:not(.ready) [data-cloak]{display:none}div#app{font-size:30px;font-weight:lighter;margin:40vh auto;text-align:center}div#app:empty:before{content:"Loading..."}.emoji{height:1.2rem;vertical-align:middle}.progress{background-color:var(--theme-color,#42b983);height:2px;left:0;position:fixed;right:0;top:0;transition:width .2s,opacity .4s;width:0;z-index:999999}.search .search-keyword,.search a:hover{color:var(--theme-color,#42b983)}.search .search-keyword{font-style:normal;font-weight:700}body,html{height:100%}body{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:#34495e;font-family:Source Sans Pro,Helvetica Neue,Arial,sans-serif;font-size:15px;letter-spacing:0;margin:0;overflow-x:hidden}img{max-width:100%}a[disabled]{cursor:not-allowed;opacity:.6}kbd{border:1px solid #ccc;border-radius:3px;display:inline-block;font-size:12px!important;line-height:12px;margin-bottom:3px;padding:3px 5px;vertical-align:middle}li input[type=checkbox]{margin:0 .2em .25em 0;vertical-align:middle}.app-nav{margin:25px 60px 0 0;position:absolute;right:0;text-align:right;z-index:10}.app-nav.no-badge{margin-right:25px}.app-nav p{margin:0}.app-nav>a{margin:0 1rem;padding:5px 0}.app-nav li,.app-nav ul{display:inline-block;list-style:none;margin:0}.app-nav a{color:inherit;font-size:16px;text-decoration:none;transition:color .3s}.app-nav a.active,.app-nav a:hover{color:var(--theme-color,#42b983)}.app-nav a.active{border-bottom:2px solid var(--theme-color,#42b983)}.app-nav li{display:inline-block;margin:0 1rem;padding:5px 0;position:relative}.app-nav li ul{background-color:#fff;border:1px solid;border-color:#ddd #ddd #ccc;border-radius:4px;box-sizing:border-box;display:none;max-height:calc(100vh - 61px);overflow-y:auto;padding:10px 0;position:absolute;right:-15px;text-align:left;top:100%;white-space:nowrap}.app-nav li ul li{display:block;font-size:14px;line-height:1rem;margin:8px 14px;white-space:nowrap}.app-nav li ul a{display:block;font-size:inherit;margin:0;padding:0}.app-nav li ul a.active{border-bottom:0}.app-nav li:hover ul{display:block}.github-corner{border-bottom:0;position:fixed;right:0;text-decoration:none;top:0;z-index:1}.github-corner:hover .octo-arm{-webkit-animation:octocat-wave .56s ease-in-out;animation:octocat-wave .56s ease-in-out}.github-corner svg{color:#fff;fill:var(--theme-color,#42b983);height:80px;width:80px}main{display:block;position:relative;width:100vw;height:100%;z-index:0}main.hidden{display:none}.anchor{display:inline-block;text-decoration:none;transition:all .3s}.anchor span{color:#34495e}.anchor:hover{text-decoration:underline}.sidebar{border-right:1px solid rgba(0,0,0,.07);overflow-y:auto;padding:40px 0 0;position:absolute;top:0;bottom:0;left:0;transition:transform .25s ease-out;width:300px;z-index:20}.sidebar>h1{margin:0 auto 1rem;font-size:1.5rem;font-weight:300;text-align:center}.sidebar>h1 a{color:inherit;text-decoration:none}.sidebar>h1 .app-nav{display:block;position:static}.sidebar .sidebar-nav{line-height:2em;padding-bottom:40px}.sidebar li.collapse .app-sub-sidebar{display:none}.sidebar ul{margin:0 0 0 15px;padding:0}.sidebar li>p{font-weight:700;margin:0}.sidebar ul,.sidebar ul li{list-style:none}.sidebar ul li a{border-bottom:none;display:block}.sidebar ul li ul{padding-left:20px}.sidebar::-webkit-scrollbar{width:4px}.sidebar::-webkit-scrollbar-thumb{background:transparent;border-radius:4px}.sidebar:hover::-webkit-scrollbar-thumb{background:hsla(0,0%,53.3%,.4)}.sidebar:hover::-webkit-scrollbar-track{background:hsla(0,0%,53.3%,.1)}.sidebar-toggle{background-color:transparent;background-color:hsla(0,0%,100%,.8);border:0;outline:none;padding:10px;position:absolute;bottom:0;left:0;text-align:center;transition:opacity .3s;width:284px;z-index:30}.sidebar-toggle .sidebar-toggle-button:hover{opacity:.4}.sidebar-toggle span{background-color:var(--theme-color,#42b983);display:block;margin-bottom:4px;width:16px;height:2px}body.sticky .sidebar,body.sticky .sidebar-toggle{position:fixed}.content{padding-top:60px;position:absolute;top:0;right:0;bottom:0;left:300px;transition:left .25s ease}.markdown-section{margin:0 auto;max-width:800px;padding:30px 15px 40px;position:relative}.markdown-section>*{box-sizing:border-box;font-size:inherit}.markdown-section>:first-child{margin-top:0!important}.markdown-section hr{border:none;border-bottom:1px solid #eee;margin:2em 0}.markdown-section iframe{border:1px solid #eee;width:1px;min-width:100%}.markdown-section table{border-collapse:collapse;border-spacing:0;display:block;margin-bottom:1rem;overflow:auto;width:100%}.markdown-section th{font-weight:700}.markdown-section td,.markdown-section th{border:1px solid #ddd;padding:6px 13px}.markdown-section tr{border-top:1px solid #ccc}.markdown-section p.tip,.markdown-section tr:nth-child(2n){background-color:#f8f8f8}.markdown-section p.tip{border-bottom-right-radius:2px;border-left:4px solid #f66;border-top-right-radius:2px;margin:2em 0;padding:12px 24px 12px 30px;position:relative}.markdown-section p.tip:before{background-color:#f66;border-radius:100%;color:#fff;content:"!";font-family:Dosis,Source Sans Pro,Helvetica Neue,Arial,sans-serif;font-size:14px;font-weight:700;left:-12px;line-height:20px;position:absolute;height:20px;width:20px;text-align:center;top:14px}.markdown-section p.tip code{background-color:#efefef}.markdown-section p.tip em{color:#34495e}.markdown-section p.warn{background:rgba(66,185,131,.1);border-radius:2px;padding:1rem}.markdown-section ul.task-list>li{list-style-type:none}body.close .sidebar{transform:translateX(-300px)}body.close .sidebar-toggle{width:auto}body.close .content{left:0}@media print{.app-nav,.github-corner,.sidebar,.sidebar-toggle{display:none}}@media screen and (max-width:768px){.github-corner,.sidebar,.sidebar-toggle{position:fixed}.app-nav{margin-top:16px}.app-nav li ul{top:30px}main{height:auto;overflow-x:hidden}.sidebar{left:-300px;transition:transform .25s ease-out}.content{left:0;max-width:100vw;position:static;padding-top:20px;transition:transform .25s ease}.app-nav,.github-corner{transition:transform .25s ease-out}.sidebar-toggle{background-color:transparent;width:auto;padding:30px 30px 10px 10px}body.close .sidebar{transform:translateX(300px)}body.close .sidebar-toggle{background-color:hsla(0,0%,100%,.8);transition:background-color 1s;width:284px;padding:10px}body.close .content{transform:translateX(300px)}body.close .app-nav,body.close .github-corner{display:none}.github-corner:hover .octo-arm{-webkit-animation:none;animation:none}.github-corner .octo-arm{-webkit-animation:octocat-wave .56s ease-in-out;animation:octocat-wave .56s ease-in-out}}@-webkit-keyframes octocat-wave{0%,to{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}@keyframes octocat-wave{0%,to{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}section.cover{align-items:center;background-position:50%;background-repeat:no-repeat;background-size:cover;height:100vh;display:none}section.cover.show{display:flex}section.cover.has-mask .mask{background-color:#fff;opacity:.8;position:absolute;top:0;height:100%;width:100%}section.cover .cover-main{flex:1;margin:-20px 16px 0;text-align:center;z-index:1}section.cover a{color:inherit}section.cover a,section.cover a:hover{text-decoration:none}section.cover p{line-height:1.5rem;margin:1em 0}section.cover h1{color:inherit;font-size:2.5rem;font-weight:300;margin:.625rem 0 2.5rem;position:relative;text-align:center}section.cover h1 a{display:block}section.cover h1 small{bottom:-.4375rem;font-size:1rem;position:absolute}section.cover blockquote{font-size:1.5rem;text-align:center}section.cover ul{line-height:1.8;list-style-type:none;margin:1em auto;max-width:500px;padding:0}section.cover .cover-main>p:last-child a{border-radius:2rem;border:1px solid var(--theme-color,#42b983);box-sizing:border-box;color:var(--theme-color,#42b983);display:inline-block;font-size:1.05rem;letter-spacing:.1rem;margin:.5rem 1rem;padding:.75em 2rem;text-decoration:none;transition:all .15s ease}section.cover .cover-main>p:last-child a:last-child{background-color:var(--theme-color,#42b983);color:#fff}section.cover .cover-main>p:last-child a:last-child:hover{color:inherit;opacity:.8}section.cover .cover-main>p:last-child a:hover{color:inherit}section.cover blockquote>p>a{border-bottom:2px solid var(--theme-color,#42b983);transition:color .3s}section.cover blockquote>p>a:hover{color:var(--theme-color,#42b983)}.sidebar,body{background-color:#fff}.sidebar{color:#364149}.sidebar li{margin:6px 0}.sidebar ul li a{color:#505d6b;font-size:14px;font-weight:400;overflow:hidden;text-decoration:none;text-overflow:ellipsis;white-space:nowrap}.sidebar ul li a:hover{text-decoration:underline}.sidebar ul li ul{padding:0}.sidebar ul li.active>a{border-right:2px solid;color:var(--theme-color,#42b983);font-weight:600}.app-sub-sidebar li:before{content:"-";padding-right:4px;float:left}.markdown-section h1,.markdown-section h2,.markdown-section h3,.markdown-section h4,.markdown-section strong{color:#2c3e50;font-weight:600}.markdown-section a{color:var(--theme-color,#42b983);font-weight:600}.markdown-section h1{font-size:2rem;margin:0 0 1rem}.markdown-section h2{font-size:1.75rem;margin:45px 0 .8rem}.markdown-section h3{font-size:1.5rem;margin:40px 0 .6rem}.markdown-section h4{font-size:1.25rem}.markdown-section h5{font-size:1rem}.markdown-section h6{color:#777;font-size:1rem}.markdown-section figure,.markdown-section p{margin:1.2em 0}.markdown-section ol,.markdown-section p,.markdown-section ul{line-height:1.6rem;word-spacing:.05rem}.markdown-section ol,.markdown-section ul{padding-left:1.5rem}.markdown-section blockquote{border-left:4px solid var(--theme-color,#42b983);color:#858585;margin:2em 0;padding-left:20px}.markdown-section blockquote p{font-weight:600;margin-left:0}.markdown-section iframe{margin:1em 0}.markdown-section em{color:#7f8c8d}.markdown-section code{border-radius:2px;color:#e96900;font-size:.8rem;margin:0 2px;padding:3px 5px;white-space:pre-wrap}.markdown-section code,.markdown-section pre{background-color:#f8f8f8;font-family:Roboto Mono,Monaco,courier,monospace}.markdown-section pre{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;line-height:1.5rem;margin:1.2em 0;overflow:auto;padding:0 1.4rem;position:relative;word-wrap:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#8e908c}.token.namespace{opacity:.7}.token.boolean,.token.number{color:#c76b29}.token.punctuation{color:#525252}.token.property{color:#c08b30}.token.tag{color:#2973b7}.token.string{color:var(--theme-color,#42b983)}.token.selector{color:#6679cc}.token.attr-name{color:#2973b7}.language-css .token.string,.style .token.string,.token.entity,.token.url{color:#22a2c9}.token.attr-value,.token.control,.token.directive,.token.unit{color:var(--theme-color,#42b983)}.token.function,.token.keyword{color:#e96900}.token.atrule,.token.regex,.token.statement{color:#22a2c9}.token.placeholder,.token.variable{color:#3d8fd1}.token.deleted{text-decoration:line-through}.token.inserted{border-bottom:1px dotted #202746;text-decoration:none}.token.italic{font-style:italic}.token.bold,.token.important{font-weight:700}.token.important{color:#c94922}.token.entity{cursor:help}.markdown-section pre>code{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;background-color:#f8f8f8;border-radius:2px;color:#525252;display:block;font-family:Roboto Mono,Monaco,courier,monospace;font-size:.8rem;line-height:inherit;margin:0 2px;max-width:inherit;overflow:inherit;padding:2.2em 5px;white-space:inherit}.markdown-section code:after,.markdown-section code:before{letter-spacing:.05rem}code .token{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;min-height:1.5rem;position:relative;left:auto}pre:after{color:#ccc;content:attr(data-lang);font-size:.6rem;font-weight:600;height:15px;line-height:15px;padding:5px 10px 0;position:absolute;right:0;text-align:right;top:0} 2 | --------------------------------------------------------------------------------