├── .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 | 
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 |
--------------------------------------------------------------------------------