github.com/aychain/blockbook@v0.1.1-0.20181121092459-6d1fc7e07c5b/static/test.html (about) 1 <!doctype html> 2 <html lang="en"> 3 4 <head> 5 <meta charset="utf-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 7 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous"> 8 <style> 9 .row { 10 margin-top: 1%; 11 } 12 </style> 13 <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.7.4/socket.io.js"></script> 14 <title>Test socket.io</title> 15 <script> 16 var socket; 17 function connect(server) { 18 socket = io(server, { transports: ['websocket'] }); 19 socket.on('connect', function () { 20 console.log('socket connected'); 21 document.getElementById('connectionStatus').innerText = "connected"; 22 }); 23 } 24 25 function getAddressTxids() { 26 var addresses = document.getElementById('getAddressTxidsAddresses').value.split(","); 27 addresses = addresses.map(s => s.trim()); 28 var mempool = document.getElementById("getAddressTxidsMempool").checked; 29 lookupTransactionsIdsMempool(addresses, mempool, 20000000, 0, function (result) { 30 console.log('getAddressTxids sent successfully'); 31 console.log(result); 32 document.getElementById('getAddressTxidsResult').innerText = JSON.stringify(result).replace(/,/g, ", "); 33 }); 34 } 35 36 function lookupTransactionsIdsMempool(addresses, mempool, start, end, f) { 37 const method = 'getAddressTxids'; 38 const rangeParam = mempool ? { 39 start, 40 end, 41 queryMempoolOnly: true, 42 } : { 43 start, 44 end, 45 queryMempol: false, 46 }; 47 const params = [ 48 addresses, 49 rangeParam, 50 ]; 51 return socket.send({ method, params }, f); 52 } 53 54 function getAddressHistory() { 55 var addresses = document.getElementById('getAddressHistoryAddresses').value.split(","); 56 addresses = addresses.map(s => s.trim()); 57 var mempool = document.getElementById("getAddressHistoryMempool").checked; 58 var from = parseInt(document.getElementById("getAddressHistoryFrom").value); 59 var to = parseInt(document.getElementById("getAddressHistoryTo").value); 60 lookupAddressHistories(addresses, from, to, mempool, 90000000, 0, function (result) { 61 console.log('getAddressHistory sent successfully'); 62 console.log(result); 63 document.getElementById('getAddressHistoryResult').innerText = JSON.stringify(result).replace(/,/g, ", "); 64 }); 65 } 66 67 function lookupAddressHistories(addresses, from, to, mempool, start, end, f) { 68 const method = 'getAddressHistory'; 69 const opts = mempool ? { 70 start, // needed for older bitcores (so we don't load all history if bitcore-node < 3.1.3) 71 end, 72 queryMempoolOnly: true, 73 } : { 74 start, 75 end, 76 queryMempol: false, 77 }; 78 const params = [ 79 addresses, 80 { 81 ...opts, 82 from, 83 to, 84 }, 85 ]; 86 return socket.send({ method, params }, f); 87 } 88 89 function lookupTransactionsIdsMempool(addresses, mempool, start, end, f) { 90 const method = 'getAddressTxids'; 91 const opts = mempool ? { 92 start, 93 end, 94 queryMempoolOnly: true, 95 } : { 96 start, 97 end, 98 queryMempol: false, 99 }; 100 const params = [ 101 addresses, 102 opts, 103 ]; 104 return socket.send({ method, params }, f); 105 } 106 107 function getBlockHeader() { 108 var param = document.getElementById('getBlockHeaderParam').value.trim(); 109 lookupBlockHash(isHash(param) ? param : parseInt(param), function (result) { 110 console.log('getBlockHeader sent successfully'); 111 console.log(result); 112 document.getElementById('getBlockHeaderResult').innerText = JSON.stringify(result).replace(/,/g, ", "); 113 }); 114 } 115 116 function isHash(str) { 117 var re = /[0-9A-Fa-f]{64}/g; 118 return re.test(str); 119 } 120 121 function lookupBlockHash(heightOrHash, f) { 122 const method = 'getBlockHeader'; 123 const params = [heightOrHash]; 124 return socket.send({ method, params }, f); 125 } 126 127 function estimateSmartFee() { 128 var blocks = document.getElementById('estimateSmartFeeBlocks').value.trim(); 129 var conservative = document.getElementById("estimateSmartFeeConservative").checked; 130 estimateSmartTxFee(parseInt(blocks), conservative, function (result) { 131 console.log('estimateSmartFee sent successfully'); 132 console.log(result); 133 document.getElementById('estimateSmartFeeResult').innerText = JSON.stringify(result).replace(/,/g, ", "); 134 }); 135 } 136 137 function estimateSmartTxFee(blocks, conservative, f) { 138 const method = 'estimateSmartFee'; 139 const params = [blocks, conservative]; 140 return socket.send({ method, params }, f); 141 } 142 143 function estimateFee() { 144 var blocks = document.getElementById('estimateFeeBlocks').value.trim(); 145 estimateTxFee(parseInt(blocks), function (result) { 146 console.log('estimateFee sent successfully'); 147 console.log(result); 148 document.getElementById('estimateFeeResult').innerText = JSON.stringify(result).replace(/,/g, ", "); 149 }); 150 } 151 152 function estimateTxFee(blocks, f) { 153 const method = 'estimateFee'; 154 const params = [blocks]; 155 return socket.send({ method, params }, f); 156 } 157 158 function getInfo() { 159 lookupSyncStatus(function (result) { 160 console.log('getInfo sent successfully'); 161 console.log(result); 162 document.getElementById('getInfoResult').innerText = JSON.stringify(result).replace(/,/g, ", "); 163 }); 164 } 165 166 function lookupSyncStatus(f) { 167 const method = 'getInfo'; 168 const params = []; 169 return socket.send({ method, params }, f); 170 } 171 172 function getDetailedTransaction() { 173 var hash = document.getElementById('getDetailedTransactionHash').value.trim(); 174 lookupDetailedTransaction(hash, function (result) { 175 console.log('getDetailedTransaction sent successfully'); 176 console.log(result); 177 document.getElementById('getDetailedTransactionResult').innerText = JSON.stringify(result).replace(/,/g, ", "); 178 }); 179 } 180 181 function lookupDetailedTransaction(hash, f) { 182 const method = 'getDetailedTransaction'; 183 var params = [ 184 hash, 185 ]; 186 return socket.send({ method, params }, f); 187 } 188 189 function sendTransaction() { 190 var tx = document.getElementById('sendTransactionHex').value.trim(); 191 sendTransactionF(tx, function (result) { 192 console.log('sendTransaction sent successfully'); 193 console.log(result); 194 document.getElementById('sendTransactionResult').innerText = JSON.stringify(result).replace(/,/g, ", "); 195 }); 196 } 197 198 function sendTransactionF(hex, f) { 199 const method = 'sendTransaction'; 200 const params = [ 201 hex, 202 ]; 203 return socket.send({ method, params }, f); 204 } 205 206 function subscribeHashBlock() { 207 socket.emit('subscribe', "bitcoind/hashblock", function (result) { 208 console.log('subscribe bitcoind/hashblock sent successfully'); 209 console.log(result); 210 }); 211 socket.on("bitcoind/hashblock", function (result) { 212 console.log('on bitcoind/hashblock'); 213 console.log(result); 214 document.getElementById('subscribeHashBlockResult').innerText += JSON.stringify(result).replace(/,/g, ", ") + "\n"; 215 }); 216 } 217 218 function subscribeAddressTxid() { 219 var addresses = document.getElementById('subscribeAddressTxidAddresses').value.split(","); 220 addresses = addresses.map(s => s.trim()); 221 socket.emit('subscribe', "bitcoind/addresstxid", addresses, function (result) { 222 console.log('subscribe bitcoind/addresstxid sent successfully'); 223 console.log(result); 224 }); 225 socket.on("bitcoind/addresstxid", function (result) { 226 console.log('on bitcoind/addresstxid'); 227 console.log(result); 228 document.getElementById('subscribeAddressTxidResult').innerText += JSON.stringify(result).replace(/,/g, ", ") + "\n"; 229 }); 230 } 231 232 function getMempoolEntry() { 233 var hash = document.getElementById('getMempoolEntryHash').value.trim(); 234 lookupMempoolEntry(hash, function (result) { 235 console.log('getMempoolEntry sent successfully'); 236 console.log(result); 237 document.getElementById('getMempoolEntryResult').innerText = JSON.stringify(result).replace(/,/g, ", "); 238 }); 239 } 240 241 function lookupMempoolEntry(hash, f) { 242 const method = 'getMempoolEntry'; 243 const params = [ 244 hash, 245 ]; 246 return socket.send({ method, params }, f); 247 } 248 </script> 249 </head> 250 251 <body> 252 <div class="container"> 253 <div class="row justify-content-center"> 254 <h1>Socket.io tester</h1> 255 </div> 256 <div class="row"> 257 <div class="col"> 258 <input class="btn btn-secondary" type="button" value="Login" onclick="connect(document.getElementById('serverAddress').value)"> 259 </div> 260 <div class="col-8"> 261 <input type="text" class="form-control" id="serverAddress" value=""> 262 </div> 263 <div class="col form-inline"> 264 <label id="connectionStatus">not connected</label> 265 </div> 266 </div> 267 <div class="row"> 268 <div class="col"> 269 <input class="btn btn-secondary" type="button" value="getAddressTxids" onclick="getAddressTxids()"> 270 </div> 271 <div class="col-8"> 272 <input type="text" class="form-control" id="getAddressTxidsAddresses" value="2N4Q5FhU2497BryFfUgbqkAJE87aKHUhXMp,2Mt7P2BAfE922zmfXrdcYTLyR7GUvbwSEns"> 273 </div> 274 <div class="col form-inline"> 275 <input type="checkbox" id="getAddressTxidsMempool"> 276 <label>only mempool</label> 277 </div> 278 </div> 279 <div class="row"> 280 <div class="col" id="getAddressTxidsResult"> 281 </div> 282 </div> 283 <div class="row"> 284 <div class="col"> 285 <input class="btn btn-secondary" type="button" value="getAddressHistory" onclick="getAddressHistory()"> 286 </div> 287 <div class="col-8"> 288 <div class="row" style="margin: 0;"> 289 <input type="text" style="width: 84%" class="form-control" id="getAddressHistoryAddresses" value="2N4Q5FhU2497BryFfUgbqkAJE87aKHUhXMp,2Mt7P2BAfE922zmfXrdcYTLyR7GUvbwSEns"> 290 <input type="text" style="width: 7%; margin-left: 5px; margin-right: 5px;" class="form-control" id="getAddressHistoryFrom" value="0"> 291 <input type="text" style="width: 7%" class="form-control" id="getAddressHistoryTo" value="5"> 292 </div> 293 </div> 294 <div class="col form-inline"> 295 <input type="checkbox" id="getAddressHistoryMempool"> 296 <label>only mempool</label> 297 </div> 298 </div> 299 <div class="row"> 300 <div class="col" id="getAddressHistoryResult"> 301 </div> 302 </div> 303 <div class="row"> 304 <div class="col"> 305 <input class="btn btn-secondary" type="button" value="getBlockHeader" onclick="getBlockHeader()"> 306 </div> 307 <div class="col-8"> 308 <input type="text" class="form-control" id="getBlockHeaderParam" value="0"> 309 </div> 310 <div class="col"> 311 </div> 312 </div> 313 <div class="row"> 314 <div class="col" id="getBlockHeaderResult"> 315 </div> 316 </div> 317 <div class="row"> 318 <div class="col"> 319 <input class="btn btn-secondary" type="button" value="estimateSmartFee" onclick="estimateSmartFee()"> 320 </div> 321 <div class="col-8"> 322 <input type="text" class="form-control" id="estimateSmartFeeBlocks" value="20"> 323 </div> 324 <div class="col form-inline"> 325 <input type="checkbox" id="estimateSmartFeeConservative" checked> 326 <label>conservative</label> 327 </div> 328 </div> 329 <div class="row"> 330 <div class="col" id="estimateSmartFeeResult"> 331 </div> 332 </div> 333 <div class="row"> 334 <div class="col"> 335 <input class="btn btn-secondary" type="button" value="estimateFee" onclick="estimateFee()"> 336 </div> 337 <div class="col-8"> 338 <input type="text" class="form-control" id="estimateFeeBlocks" value="20"> 339 </div> 340 <div class="col"></div> 341 </div> 342 <div class="row"> 343 <div class="col" id="estimateFeeResult"> 344 </div> 345 </div> 346 <div class="row"> 347 <div class="col"> 348 <input class="btn btn-secondary" type="button" value="getInfo" onclick="getInfo()"> 349 </div> 350 <div class="col-10" id="getInfoResult"> 351 </div> 352 </div> 353 <div class="row"> 354 <div class="col"> 355 <input class="btn btn-secondary" type="button" value="getDetailedTransaction" onclick="getDetailedTransaction()"> 356 </div> 357 <div class="col-8"> 358 <input type="text" class="form-control" id="getDetailedTransactionHash" value="474e6795760ebe81cb4023dc227e5a0efe340e1771c89a0035276361ed733de7"> 359 </div> 360 <div class="col"></div> 361 </div> 362 <div class="row"> 363 <div class="col" id="getDetailedTransactionResult"> 364 </div> 365 </div> 366 <div class="row"> 367 <div class="col"> 368 <input class="btn btn-secondary" type="button" value="sendTransaction" onclick="sendTransaction()"> 369 </div> 370 <div class="col-8"> 371 <input type="text" class="form-control" id="sendTransactionHex" value="010000000001019d64f0c72a0d206001decbffaa722eb1044534c74eee7a5df8318e42a4323ec10000000017160014550da1f5d25a9dae2eafd6902b4194c4c6500af6ffffffff02809698000000000017a914cd668d781ece600efa4b2404dc91fd26b8b8aed8870553d7360000000017a914246655bdbd54c7e477d0ea2375e86e0db2b8f80a8702473044022076aba4ad559616905fa51d4ddd357fc1fdb428d40cb388e042cdd1da4a1b7357022011916f90c712ead9a66d5f058252efd280439ad8956a967e95d437d246710bc9012102a80a5964c5612bb769ef73147b2cf3c149bc0fd4ecb02f8097629c94ab013ffd00000000"> 372 </div> 373 <div class="col"> 374 </div> 375 </div> 376 <div class="row"> 377 <div class="col" id="sendTransactionResult"> 378 </div> 379 </div> 380 <div class="row"> 381 <div class="col"> 382 <input class="btn btn-secondary" type="button" value="subscribe hashblock" onclick="subscribeHashBlock()"> 383 </div> 384 </div> 385 <div class="row"> 386 <div class="col" id="subscribeHashBlockResult"> 387 </div> 388 </div> 389 <div class="row"> 390 <div class="col"> 391 <input class="btn btn-secondary" type="button" value="subscribe addresstxid" onclick="subscribeAddressTxid()"> 392 </div> 393 <div class="col-8"> 394 <input type="text" class="form-control" id="subscribeAddressTxidAddresses" value="2MzTmvPJLZaLzD9XdN3jMtQA5NexC3rAPww,2NAZRJKr63tSdcTxTN3WaE9ZNDyXy6PgGuv"> 395 </div> 396 <div class="col"> 397 </div> 398 </div> 399 <div class="row"> 400 <div class="col" id="subscribeAddressTxidResult"> 401 </div> 402 </div> 403 <div class="row"> 404 <div class="col"> 405 <input class="btn btn-secondary" type="button" value="getMempoolEntry" onclick="getMempoolEntry()"> 406 </div> 407 <div class="col-8"> 408 <input type="text" class="form-control" id="getMempoolEntryHash" value=""> 409 </div> 410 <div class="col"> 411 </div> 412 </div> 413 <div class="row"> 414 <div class="col" id="getMempoolEntryResult"> 415 </div> 416 </div> 417 </div> 418 </body> 419 <script> 420 document.getElementById('serverAddress').value = window.location.protocol.replace("http", "ws") + "//" + window.location.host; 421 </script> 422 423 </html>